如何在不在 zip 目录中创建目录的情况下压缩文件?
How to zip files without creating directory inside zip directory?
我正在尝试在目标路径压缩文件。一切都很完美。我的文件压缩在目的地 URL。但问题是当我解压缩时,我的文件在目录中。我不希望我的文件在目录中。当我解压缩时,我想查看我的文件。
这是我的代码:
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 {
}
我是您正在使用的库 ZIP Foundation 的作者。
如果我对您的代码的理解正确,您希望递归地将目录的内容添加到 ZIP 存档。
为此,您可以使用方便的方法 zipItem
,它在 ZIP Foundation 中作为 FileManager
的扩展实现。
默认情况下,它的行为类似于 macOS 上的存档实用程序,并将 sourceURL
的最后一个目录名称作为存档的根目录。要改变该行为(正如 Leo Dabus 在评论中指出的那样),您可以传递可选的 shouldKeepParent: false
参数:
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
局部变量以使您的示例可编译)
要验证存档确实不包含根目录,您可以使用 macOS 随附的 zipinfo
命令行实用程序。
也有可能,您服务器上的邮政编码在解压缩您的存档时隐式创建了一个目录。
我正在尝试在目标路径压缩文件。一切都很完美。我的文件压缩在目的地 URL。但问题是当我解压缩时,我的文件在目录中。我不希望我的文件在目录中。当我解压缩时,我想查看我的文件。
这是我的代码:
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 {
}
我是您正在使用的库 ZIP Foundation 的作者。
如果我对您的代码的理解正确,您希望递归地将目录的内容添加到 ZIP 存档。
为此,您可以使用方便的方法 zipItem
,它在 ZIP Foundation 中作为 FileManager
的扩展实现。
默认情况下,它的行为类似于 macOS 上的存档实用程序,并将 sourceURL
的最后一个目录名称作为存档的根目录。要改变该行为(正如 Leo Dabus 在评论中指出的那样),您可以传递可选的 shouldKeepParent: false
参数:
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
局部变量以使您的示例可编译)
要验证存档确实不包含根目录,您可以使用 macOS 随附的 zipinfo
命令行实用程序。
也有可能,您服务器上的邮政编码在解压缩您的存档时隐式创建了一个目录。