从档案中提取目录条目

问题描述 投票:1回答:1

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

从压缩文件中提取一个文件.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文件的子目录路径作为条目,我可以提取该目录及其所有内容吗?

swift xcode unzip zipfoundation
1个回答
2
投票

ZIP归档文件不存储条目的父子关系。归档文件是一个平坦的条目列表,它有一个 "父子关系"。path 属性。因为档案是以列表的形式组织的--而不是以树的形式组织的--所以没有有效的方法来获得子树。

在ZIP基金会中。Archive 符合 Sequence. 所以你可以使用 filter 来查找具有特定路径前缀的所有条目,例如。

let entries = archive.filter { $0.path.starts(with: "Test/") }

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

  • 你将不得不自己创建(中间)目录(例如用 FileManager.createDirectory(...) 在提取过程中。
  • ZIP档案 不要 需要专门 .directory 条目。最好的方法是,"按需 "创建目录层次结构。(例如,如果遇到一个条目的父路径还不存在,你就创建它)
  • 没有保证条目的顺序。所以在提取过程中不能对已有的路径做任何假设。
© www.soinside.com 2019 - 2024. All rights reserved.