Zippen mit Bordmitteln

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

Das VBA-gesteuerte Packen und Archivieren von Dateien ist eine Aufgabe, der auch Access-Entwickler immer wieder begegnen. Dass man dabei keineswegs auf externe Komponenten oder Hilfsmittel angewiesen ist und mit Windows-Bordmittel auskommen kann, soll dieser Beitrag zeigen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1502_Zippen.mdb.

Zip-Format

Es gibt zweifellos Alternativen zum altehrwürdigen Zip-Format, denn RAR oder 7z etwa bieten erheblich bessere Kompressionsraten an. Doch diese Formate setzen voraus, dass auf dem System ein entsprechendes Archivierungsprogramm installiert ist, und bei Weitergabe einer solchen Archivdatei können Sie nicht einfach davon ausgehen, dass dies beim Adressaten der Fall ist. Mit dem Zip-Format sind Sie auf der sicheren Seite: Windows hat seit einigen Generationen einen entsprechenden Support eingebaut. über den Explorer lassen sich Zip-Dateien wie Ordner behandeln, einsehen und bearbeiten. Und was sich manuell erledigen lässt, sollte sich über irgendeinen Weg auch programmtechnisch realisieren lassen.

Shell-Funktionen

Die übliche Herangehensweise, wenn Funktionen von Windows gefragt sind, ist die Suche im API-Katalog. In unserem Fall kann darauf verzichtet werden, da Windows mit der Shell-Bibliothek eine COM-Schnittstelle zur Verfügung stellt, die alles Nötige mitbringt. Es handelt sich um die shell32.dll im Systemverzeichnis, welche sich in der Liste der Verweise von VBA namentlich als Microsoft Shell Controls And Automation ausgibt. Nachdem Sie die Bibliothek ihrem Projekt über den Verweisedialog hinzugefügt haben, finden Sie deren Klassen im Objektkatalog, wenn Sie links oben den Eintrag Shell32 auswählen (Bild 1). An den Klassenbezeichnungen, wie Folder, FolderItem und ShellFolderView, lässt sich bereits ablesen, dass es hier zuvörderst um Verzeichnisse und deren Inhalte geht. Da die Shell, wie erwähnt, eine Zip-Datei als Verzeichnis ansieht, wäre nun zu erläutern, wie man so ein Verzeichnis anspricht. Dazu gehen Sie vom Hauptobjekt der Bibliothek aus, der Shell-Klasse, welche in der Abbildung bereits markiert ist.

Die Shell32-Bibliothek, im VBA-Objektkatalog dargestellt

Bild 1: Die Shell32-Bibliothek, im VBA-Objektkatalog dargestellt

Eine Instanz dieser Klasse erhalten Sie einfach über die New-Zuweisung an eine Objektvariable:

Dim objShell As New Shell32.Shell

Hier sollte nicht unerwähnt bleiben, dass die ganze Angelegenheit auch komplett ohne einen Bibliotheksverweis auskäme. Folgender Ausdruck erzeugt nämlich ebenfalls das Shell-Objekt:

Dim objShell As Object
Set objShell = _
    CreateObject("Shell.Application")

Haben Sie nun das Hauptobjekt, so können Sie sogleich allerlei Methoden desselben ansprechen. So öffnet etwa die Methode objShell.FileRun den Ausführen-Dialog von Windows, oder TrayProperties den Dialog zu Einstellungen der Taskleiste. Warum Microsoft ausgerechnet solche Funktionen in die COM-Schnittstelle verbaute, ist nicht recht nachvollziehbar, da man sie programmgesteuert wohl höchst selten aufrufen wird. Sie interessieren uns auch nicht weiter. Lediglich die Funktion NameSpace ist für unsere Belange wichtig: sie allein gibt ein Folder-Objekt, also ein Verzeichnis, zurück. Dazu übergibt man ihr als Parameter den Verzeichnisnamen:

Dim objFolder As Shell32.Folder
Set objFolder = objShell.NameSpace ( _
    "c:\windows")

Auf den Methodennamen NameSpace würde man wahrscheinlich nicht kommen und eher so etwas wie GetFolder erwarten. Grund für die Bezeichnung ist, dass sie eben nicht nur physische Verzeichnisse ermittelt, sondern auch virtuelle, wie dies beim Zip-Archiv vorliegt. Statt des Verzeichnispfads nimmt sie etwa auch Zahlen entgegen. Versuchen Sie dies:

 objShell.NameSpace(0).Title

Ergebnis wäre der String Desktop. (Title ist die Methode zum Auslesen der Bezeichnung eines Folder-Objekts.) Der komplette Pfadname ist etwas umständlicher zu ermitteln:

 objShell.NameSpace(0).Self.Path

Das ergibt etwa C:\Users\André\Desktop. Sie können nun mit den Zahlenparametern experimentieren. übergeben Sie die 3, so erhalten Sie als Bezeichnung Systemsteuerung. Tatsächlich lässt sich die Systemsteuerung ja im Explorer-Baum an-zeigen. Was aber ist deren Pfad Sie erhalten den Ausdruck

::{21EC2020-3AEA-1069-A2DD-08002B30309D}

Diese GUID symbolisiert einen virtuellen Ordner. Machen Sie die Probe aufs Exempel und setzen diese GUID als String für den Pfadnamen ein:

objShell.NameSpace(“::{21EC2020-3AEA-1069-A2DD-08002B30309D}”).Title

Auch das geht und liefert uns abermals die Bezeichnung Systemsteuerung.

Zusammengefasst also nimmt NameSpace als Parameter sowohl Verzeichnis-Strings entgegen, wie auch Zahlenwerte (die sogenannten KnownFolder-IDs) und schließlich GUIDs (KnownFolder-CLSIDs) als Strings.

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