swift - 在 swift 压缩文件时是否有一种简单的方法来保留符号链接?

时间:2021-07-17 18:39:03

标签: swift zip gzip tar symlink

这里是 Swift 新手。

TL;DR:

重点是 zlib、tar-gzip(首选)或压缩一个文件夹(在常规文件中)包含符号链接,同时保留这些符号链接(而不是将这些符号链接的实际目标压缩到存档中)。< /p>

问题:

在 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")
}

唯一的问题是它不允许您使用符号链接或具有一些自定义处理程序。

问题:

是否有一个 swift package / hack / 足够简单的方法来 tar-gzip/zlib/zip 一个足够大的文件夹,该文件夹将具有符号链接,同时仍将它们保留为链接?您能否分享一些工作片段或为我指明正确的方向?

如果能同时兼容 macos、ipados 和 ios 就最好了。

谢谢!


更新:

使用数据结构(如 https://github.com/tsolomko/SWCompression 或 GzipSwift)的库可能是正确的,但都在努力将文件夹(其中包含一些文件和符号链接)表示为数据结构,并且怀疑编写整个文件(例如 500 Gb ) 文件夹到内存中的字节缓冲区,而不是在小块中这样做是一件好事(= 内存不足问题)。

我猜应该很容易做,但是很难找到任何简单快速工作代码,这些代码适用于包含媒体和符号链接压缩和以任何格式(tar-gzip、zip 或其他任何格式)解压缩它们。

1 个答案:

答案 0 :(得分:0)

Info-ZIP 的 zip 有一个 { "data": [ { "value1": "test", "value2": 16, "submit_date": 44394 } ] } 选项来存储符号链接而不是它引用的内容。

tar,默认,将符号链接存储为链接。你必须给它一个选项 (-y) 让它跟随符号链接。

zlib 不提供任何文件/目录归档功能。仅压缩。

您可以使用 Process 从 Swift 运行 zip 或 tar 等命令。

相关问题