Travailler avec les archives ZIP en Swift (iOS/macOS) : guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travailler avec les archives ZIP en Swift (iOS/macOS)

Dans le développement moderne iOS et macOS, il est souvent nécessaire de compresser et décompresser des fichiers. Les archives ZIP sont le moyen standard de compression de données, pris en charge sur toutes les plateformes Apple. Dans cet article, nous examinerons les outils natifs de Swift pour travailler avec les ZIP, ainsi que la bibliothèque populaire ZIPFoundation.



Outils natifs de Foundation

Le framework Foundation offre des fonctionnalités de base pour la manipulation des archives via la classe NSFileCoordinator et les utilitaires système. Cependant, pour une gestion complète des ZIP, il est recommandé d'utiliser des bibliothèques tierces ou des wrappers autour des commandes système.



Bibliothèque ZIPFoundation

ZIPFoundation est une bibliothèque légère pour la manipulation des archives ZIP, écrite en Swift pur. Elle prend en charge iOS, macOS, tvOS et watchOS, ne nécessite aucune dépendance externe et est distribuée sous licence MIT.



Installation via Swift Package Manager

Ajoutez la dépendance dans Package.swift :

dependencies: [    .package(url: "https://github.com/weichsel/ZIPFoundation.git", from: "0.9.16")]

Ou via Xcode : File → Add Packages → saisissez l'URL du dépôt.



Opérations principales



1. Création d'une archive ZIP

Compression d'un seul fichier :

import ZIPFoundation

let fileManager = FileManager.defaultlet sourceURL = URL(fileURLWithPath: "/path/to/file.txt")let destinationURL = URL(fileURLWithPath: "/path/to/archive.zip")

do { try fileManager.zipItem(at: sourceURL, to: destinationURL) print("Archive créée : \\(destinationURL.path)")} catch { print("Erreur : \\(error.localizedDescription)")}


Compression d'un répertoire entier :

let directoryURL = URL(fileURLWithPath: "/path/to/folder")let archiveURL = URL(fileURLWithPath: "/path/to/folder.zip")

do { try fileManager.zipItem(at: directoryURL, to: archiveURL) print("Répertoire compressé")} catch { print("Erreur : \\(error)")}


2. Extraction d'une archive

let archiveURL = URL(fileURLWithPath: "/path/to/archive.zip")let destinationURL = URL(fileURLWithPath: "/path/to/unzip")

do { try fileManager.unzipItem(at: archiveURL, to: destinationURL) print("Extraction terminée")} catch { print("Erreur d'extraction : \\(error)")}


3. Manipulation du contenu de l'archive sans extraction

guard let archive = Archive(url: archiveURL, accessMode: .read) else {    fatalError("Impossible d'ouvrir l'archive")}

// Liste de toutes les entréesfor entry in archive { print("Fichier : \\(entry.path), taille : \\(entry.uncompressedSize) octets")}

// Lecture d'un fichier spécifiqueif let entry = archive["documents/report.pdf"] { var data = Data() do { _ = try archive.extract(entry, bufferSize: 4096) { partialData in data.append(partialData) } print("Extrait \\(data.count) octets") } catch { print("Erreur : \\(error)") }}


4. Ajout de fichiers à une archive existante

guard let archive = Archive(url: archiveURL, accessMode: .update) else {    fatalError("Impossible d'ouvrir l'archive pour mise à jour")}

let newFileURL = URL(fileURLWithPath: "/path/to/new_file.txt")do { try archive.addEntry(with: "new_file.txt", relativeTo: newFileURL.deletingLastPathComponent()) print("Fichier ajouté")} catch { print("Erreur : \\(error)")}


Gestion de la progression et des fichiers volumineux

Pour les grandes archives, utilisez Progress :

let progress = Progress(totalUnitCount: 100)let archiveURL = URL(fileURLWithPath: "/path/to/large.zip")let destinationURL = URL(fileURLWithPath: "/path/to/output")

do { try FileManager.default.unzipItem(at: archiveURL, to: destinationURL, progress

Recommendations