如何在不创建zip目录内的目录的情况下压缩文件?

时间:2018-03-13 18:46:42

标签: ios swift zip zipfoundation

我正在尝试在目标路径压缩文件。一切都很完美。我的文件在目标网址上压缩。但问题是当我解压缩时,我的文件在目录中。我不希望我的文件在目录中。当我解压缩时,我想看到我的文件。

这是我的代码:

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 {
}

1 个答案:

答案 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}}命令行实用程序。 服务器上的邮政编码也可能在解压缩存档时隐式创建目录。