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 Aussi dans la bibliothèque
Mongoose pour JavaScript (Node.js) : guide complet avec exemples
Mise en cache en C++ : Redis, memcached, LevelDB et autres outils