Arbeiten mit ZIP/Archiven in Swift (iOS/macOS)
In der modernen iOS- und macOS-Entwicklung besteht häufig die Notwendigkeit, Dateien zu packen und zu entpacken. ZIP-Archive sind die Standardmethode zur Datenkomprimierung, die auf allen Apple-Plattformen unterstützt wird. In diesem Artikel betrachten wir die nativen Swift-Mittel für die Arbeit mit ZIP sowie die beliebte Bibliothek ZIPFoundation.
Native Foundation-Mittel
Das Foundation-Framework bietet grundlegende Möglichkeiten für die Arbeit mit Archiven über die Klasse NSFileCoordinator und Systemdienstprogramme. Für eine vollwertige Arbeit mit ZIP wird jedoch die Verwendung von Drittanbieter-Bibliotheken oder Wrappern über Systembefehle empfohlen.
Bibliothek ZIPFoundation
ZIPFoundation ist eine leichtgewichtige Bibliothek für die Arbeit mit ZIP-Archiven, die in reinem Swift geschrieben ist. Sie unterstützt iOS, macOS, tvOS und watchOS, benötigt keine externen Abhängigkeiten und wird unter der MIT-Lizenz vertrieben.
Installation über Swift Package Manager
Fügen Sie die Abhängigkeit in Package.swift hinzu:
dependencies: [ .package(url: "https://github.com/weichsel/ZIPFoundation.git", from: "0.9.16")]Oder über Xcode: File → Add Packages → geben Sie die Repository-URL ein.
Grundlegende Operationen
1. ZIP-Archiv erstellen
Packen einer einzelnen Datei:
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("Archiv erstellt: \\(destinationURL.path)")} catch { print("Fehler: \\(error.localizedDescription)")}Packen eines gesamten Verzeichnisses:
let directoryURL = URL(fileURLWithPath: "/path/to/folder")let archiveURL = URL(fileURLWithPath: "/path/to/folder.zip")
do { try fileManager.zipItem(at: directoryURL, to: archiveURL) print("Verzeichnis gepackt")} catch { print("Fehler: \\(error)")}2. Archiv entpacken
let archiveURL = URL(fileURLWithPath: "/path/to/archive.zip")let destinationURL = URL(fileURLWithPath: "/path/to/unzip")
do { try fileManager.unzipItem(at: archiveURL, to: destinationURL) print("Entpacken abgeschlossen")} catch { print("Fehler beim Entpacken: \\(error)")}3. Mit Archivinhalt arbeiten ohne Extraktion
guard let archive = Archive(url: archiveURL, accessMode: .read) else { fatalError("Archiv konnte nicht geöffnet werden")}
// Liste aller Einträgefor entry in archive { print("Datei: \\(entry.path), Größe: \\(entry.uncompressedSize) Bytes")}
// Lesen einer bestimmten Dateiif let entry = archive["documents/report.pdf"] { var data = Data() do { _ = try archive.extract(entry, bufferSize: 4096) { partialData in data.append(partialData) } print("\\(data.count) Bytes extrahiert") } catch { print("Fehler: \\(error)") }}4. Dateien zu einem vorhandenen Archiv hinzufügen
guard let archive = Archive(url: archiveURL, accessMode: .update) else { fatalError("Archiv konnte nicht zum Aktualisieren geöffnet werden")}
let newFileURL = URL(fileURLWithPath: "/path/to/new_file.txt")do { try archive.addEntry(with: "new_file.txt", relativeTo: newFileURL.deletingLastPathComponent()) print("Datei hinzugefügt")} catch { print("Fehler: \\(error)")}Arbeiten mit Fortschritt und großen Dateien
Für große Archive verwenden Sie 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 Auch in der Bibliothek
Datenvalidierung in Rust: Überblick über Bibliotheken und Frameworks
ORM für Kotlin: Vergleich von Exposed, Room und Ktorm mit Beispielen
Standardbibliothek von C# (.NET): vollständiger Überblick
Arbeiten mit ZIP-Archiven in PHP: ZipArchive und Bibliotheken zur Komprimierung
Symfony/Security für PHP: Komplettguide mit Beispielen