Ich versuche, eine Datei zu einem Archiv in Swift mit der ZIPFoundation-Bibliothek hinzuzufügen.Mit ZIPFoundation, wie Sie eine Datei zu einem Archiv auf dem gewünschten Pfad hinzufügen?
Das Archiv sieht wie folgt aus:
/ /folder1/ /folder2/ <-- Move file here.
Derzeit wird diese mit meiner Datei in das Archiv hinzufügen, aber ich habe nicht die Logik der Parameter erhalten:
public func addEntry(with path: String, relativeTo baseURL: URL)
Erstellen eines Archive
Objekts und Hinzufügen der Datei mit addEntry()
, gibt es eine Möglichkeit, die Datei nicht einfach dem Stammverzeichnis des Archivs hinzuzufügen?
-Code Edit:
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 :)
Wenn der Fehler in Ihrem letzten catch-Block gedruckt wird, bedeutet dies, dass ZIPFoundation nicht auf die Datei "url" zugreifen kann. Können Sie überprüfen, ob Ihre App mit einer integrierten API Zugriff auf diese bestimmte Datei hat? Beispiel: Guard let content = try? Data (contentsOf: url) else {return} Wenn dies ebenfalls fehlschlägt, ist es einfach ein Berechtigungsproblem. (Ist Ihre URL auf eine Datei außerhalb des Containers Ihrer App gerichtet?) –
Ja, ich habe Zugriff auf diesen Inhalt, Inhalt wird mit dem obigen Code ordnungsgemäß initialisiert. –
Ihr Eintragspfad fehlt ein Pfadtrennzeichen. Wenn Sie .appending ("/ license.lcpl") in Ihrer print-Anweisung verwenden, fügen Sie dem ersten Argument von addEntry kein "/" hinzu. –