随机访问 ZIP 文件中的文件块
Random access to chunks of a file inside a ZIP
我一直在试验 ZIP 格式,特别是随机访问其中的内容。
我知道 ZIP 支持随机访问,但据我所知,这仅适用于 ZIP 存档内的完整文件。
我想知道是否可以只加载 ZIP 文件中的一部分文件,而不将整个子文件加载到内存中
注意:我只使用非压缩 zip 文件
如果您在 Windows 或 POSIX-compatible 系统(如 Linux)上 运行,则可以使用 memory-mapped 文件。
使用此解决方案,ZIP 文件将被映射到虚拟内存,这样您就可以遍历其内容 而无需在内存中加载和解析整个文件 。
您可以找到更多信息 here and there。现在大多数现代操作系统都实现了这一点。
虽然 memory-mapped 文件很棒,因为它可以与许多现有工具集成,但您可以 使用 low-level 搜索和读取 自己阅读文件。由于文件未压缩,您可以:
- 首先,阅读 zip header(在 zip 的末尾)以找到目标文件的位置;
- 然后,读取文件header得到文件的大小,检查是否真的没有压缩
- 最后,检索相对于目标文件数据偏移量的目标数据块(从文件header之后开始)。
zip 数据格式的普通文件是连续写入的,可以安全地检索。
您可以找到有关 ZIP 文件格式的更多信息 here。
我一直在试验 ZIP 格式,特别是随机访问其中的内容。
我知道 ZIP 支持随机访问,但据我所知,这仅适用于 ZIP 存档内的完整文件。
我想知道是否可以只加载 ZIP 文件中的一部分文件,而不将整个子文件加载到内存中
注意:我只使用非压缩 zip 文件
如果您在 Windows 或 POSIX-compatible 系统(如 Linux)上 运行,则可以使用 memory-mapped 文件。 使用此解决方案,ZIP 文件将被映射到虚拟内存,这样您就可以遍历其内容 而无需在内存中加载和解析整个文件 。 您可以找到更多信息 here and there。现在大多数现代操作系统都实现了这一点。
虽然 memory-mapped 文件很棒,因为它可以与许多现有工具集成,但您可以 使用 low-level 搜索和读取 自己阅读文件。由于文件未压缩,您可以:
- 首先,阅读 zip header(在 zip 的末尾)以找到目标文件的位置;
- 然后,读取文件header得到文件的大小,检查是否真的没有压缩
- 最后,检索相对于目标文件数据偏移量的目标数据块(从文件header之后开始)。
zip 数据格式的普通文件是连续写入的,可以安全地检索。
您可以找到有关 ZIP 文件格式的更多信息 here。