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 :)
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?) –
Oui, j'ai accès à ce contenu, 'content' est initialisé correctement en utilisant le code ci-dessus. –
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. –