Arbeiten mit ZIP/Archiven in Swift (iOS/macOS): vollständige Anleitung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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

Empfehlungen