这里是 Swift 新手。
重点是 zlib、tar-gzip(首选)或 zip 一个(在常规文件中)包含符号链接的文件夹,同时保留这些符号链接(不将这些符号链接的实际目标压缩到存档中)。
在 Swift 中使用文件夹和符号链接进行递归压缩似乎是一项艰巨的任务,因为 Swift 中似乎只原生实现了单个文件/数据压缩功能(https://developer.apple.com/documentation/accelerate/compressing_and_decompressing_files_with_swift_stream_compression)没有简单的实践如何使用它来处理复杂的文件夹结构。
有一些库可以帮助处理这个问题,例如 https://github.com/marmelroy/Zip 用于 zip 或 https://github.com/1024jp/GzipSwift 用于 gzip,这些库的问题是我发现没有一个将符号链接处理为符号链接。这些只需遵循符号链接并压缩实际文件。
我喜欢 marmelroy 的 Zip 语法,您可以简单地指定要压缩的文件/文件夹的 NSURL,而不必担心数据结构、文件夹结构和内容、缓冲和所有内容:
do {
let filePath = Bundle.main.url(forResource: "file", withExtension: "zip")!
let unzipDirectory = try Zip.quickUnzipFile(filePath) // Unzip
let zipFilePath = try Zip.quickZipFiles([filePath], fileName: "archive") // Zip
}
catch {
print("Something went wrong")
}
唯一的问题是它不允许您使用符号链接或拥有一些自定义处理程序。
是否有一个快速的包 / hack / 足够简单的方法来 tar-gzip/zlib/zip 一个足够大的文件夹,该文件夹将具有符号链接,同时仍将它们保留为链接?您能否分享一些工作片段或为我指出正确的方向?
如果能兼容macos、ipados和ios那就最好了。
谢谢!
更新:
使用数据结构的库(如https://github.com/tsolomko/SWCompression或GzipSwift)可能是正确的,但都在努力将文件夹(其中包含一些文件和符号链接)表示为数据结构并怀疑写入将整个(例如 500 Gb)文件夹存储到内存中的字节缓冲区而不是分成小块是一件好事(=内存不足问题)。
应该是一件容易做的事情,我想,但是很难找到任何easy工作代码in swift在这里,它适用于包含媒体和符号链接的较大文件夹,压缩和解压缩任何格式的文件(tar-gzip,zip,或者其他什么都可以)。
Info-ZIP 的 zip 有一个
-y
选项来存储符号链接而不是它引用的内容。
tar,默认情况下,将符号链接存储为链接。您必须给它一个选项 (
--dereference
) 才能让它遵循符号链接。
zlib 不提供任何文件/目录归档功能。仅压缩。
您可以使用 Process 从 Swift 运行 zip 或 tar 等命令。
旧命令:
zip -r ../myfile.zip *
新命令:
zip -yr ../myfile.zip *
旧命令将符号链接(快捷方式)作为常规文件处理,因此框架已损坏。新命令解决了我的问题。该命令部署在 Azure DevOps 上的 CD 管道上。