我正在尝试在目标路径压缩文件。一切都很完美。我的文件在目标网址上压缩。但问题是当我解压缩时,我的文件在目录中。我不希望我的文件在目录中。当我解压缩时,我想看到我的文件。
这是我的代码:
func zipData() {
let path=NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true).first!
let fileManager = FileManager()
var sourceURL = URL(fileURLWithPath: path)
sourceURL.appendPathComponent("/cropsapdb_up_\(useridsaved)")
var destinationURL = URL(fileURLWithPath: path)
destinationURL.appendPathComponent("/cropsapdb_up_\(useridsaved).zip")
do {
let fm = FileManager.default
let items = try fm.contentsOfDirectory(atPath: sourceURL.path)
guard let archive = Archive(url: destinationURL, accessMode: .create) else {
print("returning")
return
}
for item in items {
sourceURL = sourceURL.appendingPathComponent("/\(item)")
try archive.addEntry(with: sourceURL.lastPathComponent, relativeTo: sourceURL.deletingLastPathComponent())
guard let archive = Archive(url: destinationURL, accessMode: .update) else {
print("returning")
return
}
sourceURL.deleteLastPathComponent()
}
} catch {
}
答案 0 :(得分:2)
我是ZIP Foundation的作者,您正在使用的库。
如果我正确理解您的代码,您希望以递归方式将目录内容添加到ZIP存档中
为此,您可以使用方便方法FileManager
,该方法在ZIP Foundation中作为sourceURL
的扩展名实现。
默认情况下,它的行为类似于macOS上的Archive Utility,并包含shouldKeepParent: false
的最后一个目录名作为归档的根目录。要改变这种行为(正如Leo Dabus在评论中所指出的那样),您可以传递可选的func zipData() {
let useridsaved = 1
let fileManager = FileManager.default
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true).first!
var sourceURL = URL(fileURLWithPath: path)
sourceURL.appendPathComponent("cropsapdb_up_\(useridsaved)")
var destinationURL = URL(fileURLWithPath: path)
destinationURL.appendPathComponent("cropsapdb_up_\(useridsaved).zip")
do {
try fileManager.zipItem(at: sourceURL, to: destinationURL, shouldKeepParent: false)
} catch {
print(error)
}
}
参数:
let useridsaved = 1
(我添加了一个虚构的zipinfo
局部变量来使您的样本可编辑)
要验证存档确实不包含根目录,您可以使用随{8}运行的{{1}}命令行实用程序。 服务器上的邮政编码也可能在解压缩存档时隐式创建目录。