2017-09-19 1 views
1

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 :) 
+0

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?) –

+0

Ja, ich habe Zugriff auf diesen Inhalt, Inhalt wird mit dem obigen Code ordnungsgemäß initialisiert. –

+1

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. –

Antwort

1

Pfad Einträge in ZIP-Archiven sind nicht wirklich hierarchische Pfade wie auf den meisten modernen Dateisysteme. Sie sind mehr oder weniger nur Identifikatoren. In der Regel werden diese Bezeichner verwendet, um den Pfad zu speichern, der auf den Eintrag im Ursprungsdateisystem verweist.

Die addEntry(with path: ...) Methode in ZIPFoundation ist nur eine bequeme Methode für den obigen Anwendungsfall.
Zum Beispiel lassen Sie uns sagen, dass wir einen Eintrag aus einer Datei hinzufügen möchten, die den folgenden Pfad auf einem physikalischen Dateisystem hat:

/temp/x/fileA.txt 

Wenn wir einen relativen Pfad zu identifizieren, die fileA.txt Eintrag innerhalb des Archivs verwenden möchten wir könnten, verwenden:

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

Später dies würde uns erlauben, den Eintrag zu suchen mit:

archive["x/fileA.txt"] 

Wenn wir d on't wollen außer dem Dateinamen jeder Pfadinformationen halten, könnten wir verwenden:

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

Diese uns den Eintrag zu sehen erlauben würde, nur den Dateinamen verwenden:

archive["fileA.txt"] 

Wenn Sie mehr Kontrolle benötigen Über den Pfad/Dateinamen können Sie die closure based API in ZIPFoundation verwenden. Dies ist besonders nützlich, wenn der Inhalt Ihres Eintrags aus dem Speicher stammt oder Sie Einträge aus Dateien hinzufügen möchten, die kein gemeinsames übergeordnetes Verzeichnis haben.

+1

Vielen Dank für Ihre schnelle Antwort, ich werde es erneut versuchen und Ihnen die Ergebnisse mitteilen. –

+0

Ok, also eigentlich habe ich das gemacht, aber ich habe diesen Fehler 'Fehlercode = 257 'Die Datei xx konnte nicht geöffnet werden weil Sie Ich habe keine Erlaubnis es zu sehen. "'. Ich öffne das Archiv mit dem '.update' Modus. Fehle ich noch etwas? edit: Ich bin im Simulator, wenn das im Spiel eingegeben wird –

+0

Erhalten Sie diesen Fehler für die Datei, die Sie hinzufügen möchten? Wenn Sie Ihre Frage mit Code aktualisieren, kann ich einen Blick darauf werfen. –

Verwandte Themen