libarchive/libarchive
GitHub: libarchive/libarchive
一个高效可移植的多格式归档与压缩库,提供统一 API 读写 tar、zip、7z 等数十种归档格式。
Stars: 3431 | Forks: 888
# 欢迎使用 libarchive!
libarchive 项目开发了一个可移植、高效的 C 库,它可以读写多种格式的流式归档。它还包含了使用 libarchive 库的常见 `tar`、`cpio` 和 `zcat` 命令行工具的实现。
## 有疑问?发现问题?
* https://www.libarchive.org 是 libarchive 持续开发的主页,包括文档和 libarchive 邮件列表的链接。
* 要报告问题,请使用 https://github.com/libarchive/libarchive/issues 上的问题跟踪器。
* 要向 libarchive 提交改进,请通过 GitHub 提交 pull request:https://github.com/libarchive/libarchive/pulls
## 发行版内容
此发行包包含以下主要组件:
* **libarchive**:一个用于读写流式归档的库
* **tar**:'bsdtar' 程序是一个基于 libarchive 构建的功能完整的 'tar' 实现
* **cpio**:'bsdcpio' 程序是一个本质上是相同功能的不同接口
* **cat**:'bsdcat' 程序是一个简单的替代工具,用于替代 zcat、bzcat、xzcat 等
* **unzip**:'bsdunzip' 程序是一个简单的替代工具,用于替代 Info-ZIP 的 unzip
* **examples**:您可能会发现有用的一些小示例程序。
* **examples/minitar**:一个演示 libarchive 用法的紧凑示例。
* **contrib**:第三方发送给我的各种项目;如有任何问题,请联系作者。
顶级目录包含以下信息文件:
* **NEWS** - 近期更改的要点
* **COPYING** - 您可以对此进行的操作(许可证)
* **INSTALL** - 安装说明
* **README** - 本文件
* **CMakeLists.txt** - "cmake" 构建工具的输入,请参阅 INSTALL
* **configure** - 配置脚本,详情请参阅 INSTALL。如果您的源代码副本缺少 `configure` 脚本,您可以尝试通过运行 `build/autogen.sh` 中的脚本来构建它(或使用 `cmake`)。
顶级目录中的以下文件由 'configure' 脚本使用:
* `Makefile.am`、`aclocal.m4`、`configure.ac` - 用于构建此发行版,仅维护人员需要
* `Makefile.in`、`config.h.in` - configure 脚本使用的模板
## 文档
除了在线 [libarchive Wiki](https://github.com/libarchive/libarchive/wiki) 中的信息文章和文档外,发行版还包含许多手册页:
* bsdtar.1 解释了 bsdtar 程序的使用
* bsdcpio.1 解释了 bsdcpio 程序的使用
* bsdcat.1 解释了 bsdcat 程序的使用
* libarchive.3 给出了整个库的概述
* archive_read.3、archive_write.3、archive_write_disk.3 和 archive_read_disk.3 提供了读取和写入 API 的详细调用序列
* archive_entry.3 详述了 "struct archive_entry" 实用工具类
* archive_internals.3 提供了对 libarchive 内部结构和运行机制的一些见解。
* libarchive-formats.5 记录了库支持的文件格式
* cpio.5、mtree.5 和 tar.5 提供了关于这些流行归档格式的详细信息,包括有关现代 cpio 和 tar 变体的难以找到的细节。
上述手册页位于 'doc' 目录中,提供多种不同的格式。
您还应该阅读 `archive.h` 中大量的注释以及示例程序的源代码以获取更多详细信息。如果您发现任何错误或遗漏,请告诉我们。
## 支持的格式
目前,库自动检测并读取以下格式:
* 旧版 V7 tar 归档
* POSIX ustar
* GNU tar 格式(包括 GNU 长文件名、长链接名和稀疏文件)
* Solaris 9 扩展 tar 格式(包括 ACL)
* POSIX pax 交换格式
* POSIX 面向八位字节的 cpio
* SVR4 ASCII cpio
* 二进制 cpio(大端序或小端序)
* PWB 二进制 cpio
* ISO9660 CD-ROM 映像(带有可选的 Rockridge 或 Joliet 扩展)
* ZIP 归档(带有未压缩或 "deflate" 压缩条目,包括对加密 Zip 归档的支持)
* ZIPX 归档(支持 bzip2、zstd、ppmd8、lzma 和 xz 压缩条目)
* GNU 和 BSD 'ar' 归档
* 'mtree' 格式
* 7-Zip 归档(包括使用 zstandard 压缩的归档)
* Microsoft CAB 格式
* LHA 和 LZH 归档
* RAR 和 RAR 5.0 归档(由于 RAR 的专有性质,存在一些限制)
* WARC 归档
* XAR 归档
在评估归档之前,库还会检测并处理以下任何内容:
* uuencoded 文件
* 带有 RPM 包装器的文件
* gzip 压缩
* bzip2 压缩
* compress/LZW 压缩
* lzma、lzip 和 xz 压缩
* lz4 压缩
* lzop 压缩
* zstandard 压缩
该库可以创建以下任何格式的归档:
* POSIX ustar
* POSIX pax 交换格式
* "受限" pax 格式,它将创建 ustar 归档,除非条目需要 pax 扩展(用于长文件名、ACL 等)。
* 旧版 GNU tar 格式
* 旧版 V7 tar 格式
* POSIX 面向八位字节的 cpio
* SVR4 "newc" cpio
* 二进制 cpio(小端序)
* PWB 二进制 cpio
* shar 归档
* ZIP 归档(带有未压缩或 "deflate" 压缩条目)
* ZIPX 归档(带有 bzip2、zstd、lzma 或 xz 压缩条目)
* GNU 和 BSD 'ar' 归档
* 'mtree' 格式
* ISO9660 格式
* 7-Zip 归档(包括使用 zstandard 压缩的归档)
* WARC 归档
* XAR 归档
创建归档时,可以使用以下任何方式过滤结果:
* uuencode
* base64
* gzip 压缩
* bzip2 压缩
* compress/LZW 压缩
* lzma、lzip 和 xz 压缩
* lz4 压缩
* lzop 压缩
* zstandard 压缩
## 关于库设计的说明
以下说明解决了我们被问到的许多关于 libarchive 的最常见问题:
* 这是一个高度面向流的系统。这意味着它被优化为从头到尾单次遍历读取或写入归档。例如,这允许 libarchive 通过在从网络或磁带驱动器读取或写入时即时处理,来处理大到无法存储在磁盘上的归档。这也使得 libarchive 对于需要即时生成归档的工具非常有用(例如提供用户账户归档内容的网络服务器)。
* 不直接支持就地修改和随机访问归档内容。对于某些格式,这不是问题:例如,tar.gz 归档并非为随机访问而设计。在其他一些情况下,libarchive 可以重新打开归档并从头开始快速扫描,即使没有真正的随机访问,也能提供所需的能力。当然,有些应用程序确实需要真正的随机访问;这些应用程序应该考虑 libarchive 的替代方案。
* 该库设计为可通过新的压缩和归档格式进行扩展。唯一的要求是格式可作为流读取或写入,并且每个归档条目是独立的。libarchive Wiki 上有一些文章解释了如何扩展 libarchive。
* 在读取时,压缩和格式总是被自动检测。
* 所有格式使用相同的 API;使用 libarchive 的软件应该很容易透明地处理任何 libarchive 的归档格式。
* Libarchive 的自动解压支持可以通过显式选择 "raw" 和 "empty" 格式来使用,而无需归档。
* 我试图最大限度地减少静态链接污染。如果您没有显式调用特定功能(例如对特定压缩或格式的支持),它就不会被拉入静态链接的程序中。特别是,如果您没有显式启用特定的压缩或解压缩支持,则不需要链接相应的压缩或解压缩库。这也减少了在静态链接二进制文件大小非常重要的环境中二进制文件的大小。
* 该库通常是_线程安全_的,具体取决于平台:它不定义任何自己的全局变量。但是,某些平台不提供关键 C 库函数的完全线程安全版本。在这些平台上,libarchive 将使用非线程安全函数。我们非常感兴趣改进这一点的补丁。
* 函数 `archive_write_disk_header()` 在 POSIX 机器上_不是_线程安全的,并可能导致安全问题,从而导致目录成为全局可写。因此,调用代码必须对其进行互斥。这是由于调用 `umask(oldumask = umask(0))` 造成的,这会在很短的时间内将整个进程的 umask 设置为 0。如果其他线程并行调用同一个函数,它可能会被其中断,并导致可执行文件在剩余的执行过程中使用 umask=0。这将导致隐式创建的目录具有 777 权限且没有粘滞位。
* 特别是,libarchive 读取或写入目录树的模块确实使用 `chdir()` 来优化目录遍历。对于期望从多个线程进行磁盘访问的程序,这可能会导致问题。当然,这些模块是完全可选的,您可以在没有它们的情况下使用 libarchive 的其余部分。
* 然而,该库_不是_线程感知的。它不进行任何类型的锁定或线程管理。如果您创建一个 libarchive 对象并且需要从多个线程访问它,您将需要提供自己的锁定。
* 在读取时,库接受您提供给它的任何块。您的读取回调可以自由地一次向库传递一个字节,或者 mmap 整个归档并立即将其提供给库。在写入时,库总是生成正确分块的输出。
* 面向对象的方法允许您同时打开多个归档流。bsdtar 在其 "@archive" 扩展中使用了这一点。
* 归档本身使用回调函数进行读取/写入。如果您愿意,您可以直接从内存缓冲区读取归档或将其写入套接字。有一些实用函数提供易于使用的“打开文件”等功能。
* 读取/写入 API 旨在允许从任何数据源读取单个条目或将其写入任何数据源:您可以在内存中创建数据块并将其添加到 tar 归档中,而无需先写入临时文件。您还可以从归档中读取条目并将数据直接写入套接字。如果您想将条目读取/写入磁盘,有一些便捷函数可以使这一过程变得特别容易。
* 注意:“pax 交换格式”是一个 POSIX 标准扩展 tar 格式,当旧的 _ustar_ 格式不适用时应使用它。它比其他 tar 格式(包括旧版 GNU tar 格式)具有许多优势,并且被当前的 tar 实现广泛支持。
标签:Bash脚本, Bing搜索, bsdtar, bzip2, cpio, gzip, libarchive, tar, xz, zip, 压缩库, 客户端加密, 客户端加密, 工具库, 开源库, 归档处理, 归档库, 搜索引擎爬虫, 文件格式, 文件解压, 流式处理, 系统工具