这个软件包封装了zlib中可用的文件和数据压缩行为,并使用Swift封装器编写,以便与Foundation模块自然配合。 没有UnsafePointer
,没有文件描述符,没有String
路径。 此行为在3个级别可用:
使用Data
。 该行为旨在处理足够小以完全加载到RAM中的数据,但经过优化以读取映射的Data
。
使用URL
处理文件,使用FileManager
扩展。 提供了将目录压缩为文件的方法
将.zip或.tar.gz文件表示为内存中的文件/文件夹结构,使用ZipDirectoryWrapping
(类似于目录FileWrapper
)。 .zip文件中的各个文件都符合DataWrapping
(一个类似于Foundation的FileWrapper
的SwiftPatterns协议)。 对于.zip文件,直到访问它时,每个单独的文件才会被解压缩。
已经实现了基本的.zip文件打开,读取和解压。 尚未实现优化的文件写入。
已经实现了.gzip读取。
使用.compressed(using:progress:)
(或.decompressed(using:progress:)
)压缩或解压缩Data
,可以选择使用.gzip
而不是.deflate
。
使用.deflate压缩Data
不会生成标头,并且解压缩在标头之后的流上起作用。 使用gzip
压缩Data
会生成标头,适合进行包装,并且在解压缩时需要包装器。
要解压缩许多现有文件,请使用FileManager
。
func decompress(item:, with:, into:progress:)
它打开一个压缩文件,并将其内容扩展到提供的目录中。
对于以压缩形式存在于磁盘上,但在RAM中结构化的文件/文件夹的文件格式,类似于“压缩”FileWrapper
的东西会很好。 FileWrapper
存在一个设计问题:目录和常规文件都是同一个类,这意味着API没有强制编译。 使用SwiftPatterns
模块中的SerializedResourceWrapping
协议,此模块引入了ZipDirectoryWrapping
类,该类符合SubResourceWrapping
协议。 您可以像浏览目录FileWrapper
一样浏览它,但是各个文件(符合DataWrapping
)直到您访问它们的.contents
属性(对于.zip文件)才会被解压缩。
Data
方法以页面大小的组访问数据,以减少脏内存占用,但未对输出数据进行优化。 您应该只将其用于您知道在内存中有用的数据。
尚未实现:FileManager
方法利用Data的页面大小映射和FileHandles进行写入,就像它是流一样。
压缩有很多方面。 如果您想贡献,请 fork 它,编写它,并发出 PR。
以下是一些非目标
支持更多CRC。 检测错误存储/传输错误应由数据存储和传输层提供。 它不适用于文件的内部内容。
支持加密。 如今,加密由设备为整个文件系统提供。 它不适用于文件的内部内容,除非在特殊情况下。