2017-09-19 1 views
1

J'essaie d'ajouter un fichier à une archive dans Swift en utilisant la bibliothèque ZIPFoundation.En utilisant ZIPFoundation, comment ajouter un fichier à une archive au chemin désiré?

L'archive ressemble à ceci:

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

actuellement en utilisant cette option pour ajouter mon dossier à l'archive, mais je ne suis pas la logique des paramètres:

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

En créant un objet Archive et en ajoutant le fichier en utilisant addEntry(), est-il possible de ne pas simplement ajouter le fichier au chemin racine de l'archive?

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

Si l'erreur est imprimée dans votre dernier bloc catch, cela signifie que ZIPFoundation ne peut pas accéder au fichier 'url'. Pouvez-vous vérifier si votre application a accès à ce fichier particulier avec une API intégrée. Par exemple: garde laisser le contenu = essayer? Data (contentsOf: url) else {return} Si cela échoue également, c'est simplement un problème d'autorisation. (Votre URL pointe-t-elle sur un fichier à l'extérieur du conteneur de votre application?) –

+0

Oui, j'ai accès à ce contenu, 'content' est initialisé correctement en utilisant le code ci-dessus. –

+1

Il manque un séparateur de chemin à votre chemin d'accès. Bien que vous utilisiez .appending ("/ license.lcpl") dans votre instruction print, vous n'ajoutez pas de "/" au premier argument de addEntry. –

Répondre

1

entrées de chemin dans les archives ZIP ne sont pas vraiment des chemins hiérarchiques comme sur la plupart des systèmes de fichiers modernes. Ils sont plus ou moins juste des identifiants. Habituellement, ces identifiants sont utilisés pour stocker le chemin qui pointe vers l'entrée sur le système de fichiers d'origine.

La méthode addEntry(with path: ...) dans ZIPFoundation est juste une méthode pratique pour le cas d'utilisation ci-dessus.
Par exemple, disons que nous voulons ajouter une entrée dans un fichier qui a le chemin suivant sur un système de fichiers physique:

/temp/x/fileA.txt 

Si l'on veut utiliser un chemin relatif pour identifier l'entrée fileA.txt dans l'archive , nous pourrions utiliser:

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

Plus tard, cela nous permettrait de rechercher l'entrée avec:

archive["x/fileA.txt"] 

Si nous d on't voulez garder les informations de chemin, sauf le nom du fichier, on peut utiliser:

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

Cela nous permettra de rechercher l'entrée juste en utilisant le nom du fichier:

archive["fileA.txt"] 

Si vous avez besoin de plus de contrôle sur le chemin/nom de fichier, vous pouvez utiliser le closure based API in ZIPFoundation. Ceci est particulièrement utile si le contenu de votre entrée provient de la mémoire ou si vous voulez ajouter des entrées à partir de fichiers qui n'ont pas de répertoire parent commun.

+1

Merci pour votre réponse rapide, je vais essayer à nouveau et vous faire savoir les résultats –

+0

Ok, donc en fait c'est ce que je faisais, mais j'ai cette erreur 'Error Code = 257" Le fichier xx n'a pas pu être ouvert parce que vous je n'ai pas la permission de le voir. J'ouvre l'archive en utilisant le mode '.update'. Est-ce qu'il me manque encore quelque chose? edit: Je suis sur simulateur, si c'est en jeu –

+0

Avez-vous cette erreur pour le fichier que vous essayez d'ajouter? Si vous mettez à jour votre question avec du code, je peux jeter un oeil. –