从存档中提取目录条目

Extract directory entry from archive

是否可以从存档中提取目录条目? 我该怎么做?

从存档中提取 file.txt 的代码:

let fileManager = FileManager()
    let currentWorkingPath = fileManager.currentDirectoryPath
    var archiveURL = URL(fileURLWithPath: currentWorkingPath)
    archiveURL.appendPathComponent("archive.zip")
    guard let archive = Archive(url: archiveURL, accessMode: .read) else  {
        return
    }
    guard let entry = archive["file.txt"] else {
        return
    }
    var destinationURL = URL(fileURLWithPath: currentWorkingPath)
    destinationURL.appendPathComponent("out.txt")
    do {
        try archive.extract(entry, to: destinationURL)
    } catch {
        print("Extracting entry from archive failed with error:\(error)")
    }

如果我使用 zip 文件的子目录路径作为入口,我可以提取该目录及其所有内容吗?

ZIP 存档不存储条目的 parent/child 关系。存档是条目的平面列表,具有 path 属性.
因为档案被组织成一个列表——而不是树——所以没有有效的方法来获得子树。

在 ZIP Foundation 中,Archive 符合 Sequence。因此,您可以使用 filter 查找具有特定路径前缀的所有条目。例如

let entries = archive.filter { [=10=].path.starts(with: "Test/") }

然后您可以遍历所有符合条件的条目并使用问题中的 extract 代码。
不过有一些边缘情况需要考虑:

  • 您必须自己创建(中间)目录(例如 在提取期间使用 FileManager.createDirectory(...)
  • ZIP 存档不需要 需要专用的.directory 条目。最好的方法是创建目录层次结构 "on-demand"。 (例如,如果您遇到父路径尚不存在的条目,则创建它)
  • 不保证条目的顺序。所以你不能在提取过程中对已经存在的路径做出任何假设。