Per VBA komprimieren mit SawZipNG

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Eine Schnittstelle für den Einsatz mit VBA liefern einige Produkte wie etwa WinZip direkt mit. Leider sind die meisten kostenpflichtig. Access im Unternehmen stellt eine frei verfügbare DLL vor, mit der Sie von Ihrer Datenbank aus die von den verbreiteten Komprimierungstools her bekannten Funktionen nachbilden können.

SawZipNG hat es merkwürdigerweise nie zu außergewöhnlichem Ruhm gebracht: Die Bibliothek war eine Zeit lang zum Download verfügbar, danach ist sie aber aus dem Blickfeld des Internets verschwunden. Zum Glück hat Access im Unternehmen eine Kopie dieser äußerst nützlichen DLL aufgetrieben; Sie finden diese auf der Heft-CD oder unter www.access-im-unternehmen.de zum Download.

Nach der Installation des Setups steht die passende Bibliothek bereit und wartet auf die Bereitstellung in der Zieldatenbank per passendem Verweis (siehe Bild 1). Bei der Weitergabe brauchen Sie nicht das komplette Setup mitzuliefern, die Datei SawZipNG.dll reicht aus. Allerdings muss diese dann noch per RegSvr32.exe registriert werden.

pic001.tif

Bild 1: Um die Zip-DLL in eine Anwendung einzubinden, muss man einen passenden Verweis anlegen.

Der Einsatz von Late Binding würde einen Verweis überflüssig machen; wie dies aussieht, können Sie der Beispieldatenbank entnehmen.

Archiv erstellen

Das Hauptobjekt der DLL ist das Archiv-Objekt. Es steht sowohl beim Erzeugen und Hinzufügen von Dateien als auch beim Entpacken eines Zip-Archivs im Mittelpunkt.

Bevor Sie das Tool einsetzen, müssen Sie sich überlegen, ob Sie gegebenenfalls auf die Ereignisse des Archive-Objekts reagieren möchten. Diese werden unter anderem ausgelöst, wenn eine Datei zum Archiv hinzugefügt, eine Datei gelöscht oder das Archiv entpackt wird. In dem Fall müssen Sie die Objektvariable mit dem Schlüsselwort WithEvents deklarieren, was nur in Formular-, Berichts- und Klassenmodulen, aber nicht in Standardmodulen möglich ist. Hier ist dann auch unbedingt der Verweis nötig, mit Late Binding gibt es keine unmittelbare Möglichkeit zum Einsatz von WithEvents und der passenden Ereignisse.

Für den Anfang lassen wir diese Option allerdings zunächst außen vor und konzentrieren uns auf die eigentlichen Funktionen.

Die Zeilen zum Erstellen und Erzeugen eines Archivs sehen beispielsweise wie folgt aus:

Dim objArchiv As SAWZipNG.Archive
Set objArchiv = New SAWZipNG.Archive

Das Archiv existiert bis dato nur im Speicher. Sie können nun Dateien hinzufügen und das Archiv auf die Festplatte bannen. Das funktioniert etwa so:

Dim objArchiv As SAWZipNG.Archive
Set objArchiv = New SAWZipNG.Archive
With objArchiv
   .Create "c:\SawZip.zip"
   .AddFile "c:\test.txt"
End With

Die Create-Methode legt zunächst die Zip-Datei an, die AddFile-Methode fügt die angegebene Datei hinzu – fertig, die erste Zip-Datei ist erstellt!

Beachten Sie, dass Access abstürzt, wenn Sie der Create-Methode eine leere Zeichenkette übergeben. Wenn der Benutzer den Dateinamen eingibt oder auswählt, prüfen Sie diesen zuvor auf seinen Inhalt.

Natürlich gibt es noch einige Einstellungen, die Sie in den folgenden Abschnitten kennen lernen.

Beispieldaten

Zum Testen der Zip-Bibliothek brauchen Sie ein paar Verzeichnisse und Dateien, an denen Sie nichts kaputt machen können. Mit der folgenden Routine legen Sie die passenden Elemente im Verzeichnis der aktuellen Datenbank an (siehe Bild 2):

pic002.tif

Bild 2: Diese per VBA-Code schnell angelegte Verzeichnis- und Dateistruktur dient als Versuchsfeld für die Zip-Bibliothek.

Public Sub Beispieldateien()
   Dim i As Integer
   Dim j As Integer
   Dim strPfad As String
   On Error Resume Next
   strPfad = CurrentProject.Path
   MkDir strPfad & "\Zip"
   On Error GoTo 0
   For i = 1 To 10
     Open strPfad & "\Zip\Test" _
& Format(i, "00") _
& ".txt" For Output As #1 Print #1, "Test" Close #1 On Error Resume Next MkDir strPfad & "\Zip\Zap" _
& Format(i, "00") For j = 1 To 10 Open strPfad & "\Zip\Zap" _
& Format(i, "00") & "\Test" _
& Format(j, "00") & ".txt" _
For Output As #2 Write #2, "Test" Close #2 Next j On Error GoTo 0 Next i End Sub

Zu Beispielzwecken könnte man nun ein Formular entwickeln, dass etwa die Funktionen von WinZip oder ähnlichen Produkten nachbildet. Das wäre anschaulich, macht aber wenig Sinn. Viel interessanter ist es, die Zip-Funktionen beispielsweise zum Zusammenpacken zu sichernder Daten zu verwenden – ein netter Anwendungszweck wäre eine Datenbank, die Berichte im Snapshot- oder PDF-Format speichert, diese packt und per Mail verschickt. Im Folgenden lernen Sie daher die nackten VBA-Anweisungen zur Steuerung der Zip-Bibliothek kennen.

Datei verschlüsselt packen

Um sicherzustellen, dass nur der Empfänger einer Datei Zugriff auf diese hat, können Sie diese nicht nur packen, sondern auch mit einem Passwort verschlüsseln.

Public Sub DateiVerschluesseln()
   '....
   With objArchiv
     .Create CurrentProject.Path _
& "\VerschluesseltesArchiv.zip" .Password = "test" .AddFile CurrentProject.Path _
& "\zip\test01.txt" End With End Sub

Diese Routine erzeugt ein Zip-File mit einer verschlüsselten Datei, die WinZip wie in Bild 3 darstellt. Wichtig ist hier die Reihenfolge: Nur diejenigen Dateien, die nach der Angabe des Schlüsselwortes mit der Password-Eigenschaft hinzugefügt wurden, sind auch verschlüsselt.

pic003.tif

Bild 3: Verschlüsselt gezippte Dateien lassen sich nur mit dem entsprechenden Passwort wieder entschlüsseln.

Verzeichnisse packen

Wenn Sie die AddFile-Anweisung durch AddFolder ersetzen und ein Verzeichnis statt einer Datei angeben, können Sie ein komplettes Verzeichnis komprimieren. Ob Sie dabei nur das angegebene Verzeichnis und die darin enthaltenen Dateien oder auch die Unterverzeichnisse mit komplettem Inhalt zippen, hängt von der Einstellung für den Parameter includeSubDirs ab. Die folgende Routine demonstriert das Komprimieren des kompletten Astes ab dem Verzeichnis Zip:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar