def _iter_files(self, offset: int, data_length: int) -> Iterable[Tuple[BinaryIO, int, int]]:
if offset < 0 or offset + data_length > self._download_info.total_size:
raise IndexError('Data position out of range')
# Find rightmost file which start offset less than or equal to `offset`
index = bisect_right(self._offsets, offset) - 1
while data_length != 0:
file_start_offset = self._offsets[index]
file_end_offset = self._offsets[index + 1]
file_pos = offset - file_start_offset
bytes_to_operate = min(file_end_offset - offset, data_length)
descriptor = self._descriptors[index]
yield descriptor, file_pos, bytes_to_operate
offset += bytes_to_operate
data_length -= bytes_to_operate
index += 1
评论列表
文章目录