使用 ZIPFoundation,如何将文件添加到所需路径的存档中?

Using ZIPFoundation, how to add a file to an archive at desired path?

我正在尝试使用 ZIPFoundation 库将文件添加到 Swift 中的存档。

存档如下所示:

/
/folder1/
/folder2/ <-- Move file here.

目前正在使用它来将我的文件添加到存档中,但我不明白参数的逻辑:

public func addEntry(with path: String, relativeTo baseURL: URL)

创建一个 Archive 对象并使用 addEntry() 添加文件,有没有办法不只是将文件添加到存档的根路径?

代码编辑:

internal func moveLicense(from licenseUrl: URL, to publicationUrl: URL) throws {
    guard let archive = Archive(url: publicationUrl, accessMode: .update) else  {
        return
    }
    // Create local folder to have the same path as in the archive.
    let fileManager = FileManager.default
    var urlMetaInf = licenseUrl.deletingLastPathComponent()
    
    urlMetaInf.appendPathComponent("META-INF", isDirectory: true)
    try fileManager.createDirectory(at: urlMetaInf, withIntermediateDirectories: true, attributes: nil)
    
    let uuu = URL(fileURLWithPath: urlMetaInf.path, isDirectory: true)
    // move license in the meta-inf folder.
    try fileManager.moveItem(at: licenseUrl, to: uuu.appendingPathComponent("license.lcpl"))
    // move dir
    print(uuu.lastPathComponent.appending("/license.lcpl"))
    print(uuu.deletingLastPathComponent())
    do {
    try archive.addEntry(with: uuu.lastPathComponent.appending("license.lcpl"), // Missing '/' before license
                         relativeTo: uuu.deletingLastPathComponent())
    } catch {
        print(error)
    }
}
// This is still testing code, don't mind the names :)

ZIP 存档中的路径条目并不是像大多数现代文件系统那样真正的分层路径。它们或多或少只是标识符。通常这些标识符用于存储指向原始文件系统上的条目的路径。

ZIPFoundation 中的 addEntry(with path: ...) 方法只是上述用例的一种便捷方法。
例如,假设我们要从物理文件系统上具有以下路径的文件中添加一个条目:

/temp/x/fileA.txt

如果我们想使用相对路径来识别存档中的 fileA.txt 条目,我们可以使用:

archive.addEntry(with: "x/fileA.txt", relativeTo: URL(fileURLWithPath: "/temp/")

稍后,这将允许我们查找条目:

archive["x/fileA.txt"]

如果我们不想保留除文件名之外的任何路径信息,我们可以使用:

let url = URL(fileURLWithPath: "/temp/x/fileA.txt"
archive.addEntry(with: url.lastPathComponent, relativeTo: url.deletingLastPathComponent())

这样我们就可以使用文件名查找条目:

archive["fileA.txt"]

如果您需要对 path/filename 进行更多控制,可以使用 closure based API in ZIPFoundation。如果您的条目内容来自内存,或者您想从没有公共父目录的文件中添加条目,这将特别有用。