如何在不在 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 命令行实用程序。
也有可能,您服务器上的邮政编码在解压缩您的存档时隐式创建了一个目录。