从存档中提取目录条目
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"。 (例如,如果您遇到父路径尚不存在的条目,则创建它)
- 不保证条目的顺序。所以你不能在提取过程中对已经存在的路径做出任何假设。
是否可以从存档中提取目录条目? 我该怎么做?
从存档中提取 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"。 (例如,如果您遇到父路径尚不存在的条目,则创建它) - 不保证条目的顺序。所以你不能在提取过程中对已经存在的路径做出任何假设。