Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 4/2002.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Dateien verwalten mit Access

Autor: André Minhorst, Duisburg

!

Bei vielen Anwendungen ist es notwendig, Dateien oder Verzeichnisse auszuwählen und auf diese zuzugreifen. Das FileSystemObject der Scripting-Laufzeitbibliothek bietet eine Reihe von Methoden und Eigenschaften an, die praktisch jeden Zugriff auf das Filesystem von Windows erlauben. Im vorliegenden Beitrag lernen Sie einige interessante Beispiele für den Einsatz des FileSystemObjects in Zusammenarbeit mit Access kennen. Dazu basteln Sie sich einen kleinen Windows-Dateimanager in Form eines Access-Formulars, mit dem Sie bequem aus Ihrer Datenbankanwendung heraus kleinere Operationen wie z. B. das Öffnen, Kopieren, Verschieben oder Löschen von Dateien und Verzeichnissen ausführen können.

Das FileSystemObject enthält Objekte, Methoden und Eigenschaften für den Zugriff auf die Laufwerke, Ordner und Dateien des Filesystems von Windows.

Sie können Informationen über alle genannten Objekte ermitteln und Ordner und Dateien erstellen, kopieren, ausschneiden, einfügen, bearbeiten und löschen.

Prinzipiell können Sie durch die Programmierung mit dem FileSystemObject alle Aufgaben erledigen, die auch der Windows-Explorer (s. Abb. 1) zur Verfügung stellt.

Abb. 1: Der klassische Windows-Explorer

Wenn Sie die Methoden und Eigenschaften des FileSystemObjects mit den Möglichkeiten zusammenführen, die Access-Formulare bieten, können Sie sich Ihren eigenen kleinen Dateimanager mit Access erstellen und müssen nicht mehr auf die Windows-eigenen Möglichkeiten zurückgreifen.

Dies ist vor allem interessant, wenn Sie umfangreichere Datenbanken haben, die den gesamten Funktionsumfang abdecken, den Ihre Mitarbeiter benötigen.

Sie können den Dateimanager dann in die Access-Datenbank integrieren und müssen für einfache File-Operationen keine externe Anwendung mehr öffnen.

Außerdem können Sie nach Belieben spezielle Funktionen hinzufügen, z. B. das Ausdrucken einer Dateiliste auf Papier (beispielsweise für die Verwendung als CD-Cover) oder die vom Windows-Explorer nicht unterstützte Funktion, die Größe aller Verzeichnisse eines Laufwerks auf einen Blick anzuzeigen.

Das ist vor allem interessant, wenn Sie sich wieder einmal fragen, in welchen Verzeichnissen eigentlich die ganzen Daten stecken, die Ihre Festplatte hoffnungslos verstopfen. Mit dem Windows-Explorer müssen Sie hierzu nämlich die Eigenschaften jedes einzelnen Verzeichnisses anzeigen, während Sie mit einer selbst programmierten Funktion schnell die gewünschten Daten ermitteln können.

Hinweis

Um die Methoden und Eigenschaften des FileSystemObjects verwenden zu können, müssen Sie einen Verweis auf die entsprechende Bibliothek erstellen. Der Name der Bibliothek lautet Windows Scripting Runtime. Wie Sie einen Verweis auf eine Bibliothek erstellen, erfahren Sie in dem Beitrag Setzen von Verweisen auf Bibliotheken. Falls Sie diesen Verweis nicht finden, ist möglicherweise der Windows Scripting Host nicht installiert oder aktiviert: In dem Fall finden Sie die benötigte Software im Internet unter www.microsoft.com/msdownload/vbscript/scripting.asp. (

Abb. 2: Das Formular frmDateimanager mit seinen Steuerelementen in der Entwurfsansicht

Als Beispiel für die Anwendung der Eigenschaften und Methoden des FileSystemObjects erstellen Sie ein Formular, mit dem Sie Verzeichnisse und Dateien anzeigen sowie die unterschiedlichsten Operationen mit diesen Elementen durchführen können.

Beispielformular erstellen

Erstellen Sie zunächst ein Beispielformular, von dem aus Sie die unterschiedlichen Aktionen ausführen und Laufwerke, Verzeichnisse und Dateien anzeigen können.

Stellen Sie die Eigenschaften Bildlaufleisten, Datensatzmarkierer, Navigationsschaltflächen und Trennlinien auf den Wert Nein ein.

Erstellen Sie anschließend einige Steuerelemente auf dem neuen Formular und ordnen Sie diese wie in Abb. 2 an. In Tabelle 1 finden Sie eine Liste der Steuerelemente mit ihren Namen und Funktionen.

Laufwerke anzeigen

Das Kombinationsfeld cboLaufwerke soll alle Laufwerke des Filesystems anzeigen. Da es somit nicht an eine bestimmte Datenherkunft gebunden ist, sondern erst mit den gewünschten Werten gefüllt wird, müssen Sie den Wert der Eigenschaft Herkunftsart von Tabelle/Abfrage auf Wertliste ändern.

Steuerelement

Funktion

cboLaufwerke

Auswahl des gewünschten Laufwerks

txtVerzeichnis

Anzeige des aktuellen Verzeichnisses

cmdNeuerOrdner

Schaltfläche zum Anlegen eines neuen Ordners

cmdLoeschen

Schaltfläche zum Löschen des ausgewählten Objekts aus lstOrdner oder lstDateien

cmdEinfuegen

Schaltfläche zum Einfügen der mit cmdKopieren oder cmdAusschneiden markierten Datei

cmdKopieren

Schaltfläche zur Auswahl einer zu kopierenden Datei

cmdAusschneiden

Schaltfläche zur Auswahl einer auszuschneidenden Datei

lstOrdner

Liste der Ordner, die sich in dem Verzeichnis in txtVerzeichnis befinden

lstDateien

Liste der Dateien, die sich in dem Verzeichnis in txtVerzeichnis befinden

lblVerzeichnisse, lblDateien, lblGroesse, lblAenderungsdatum

Beschriftungsfelder, die bei Doppelklick einen Sortiervorgang auslösen

txtSortVerzeichnisname, txtSortDateiname, txtSortGroesse, txtSortAenderung

Versteckte Textfelder zum Speichern der aktuellen Sortierung der Listenspalten

txtAktion

Verstecktes Textfeld zum Speichern der auszuführenden Aktion, also Kopieren oder Ausschneiden

txtMarkiert

Verstecktes Textfeld zum Speichern ausgewählter Dateien/Ordner

txtSortierfeld

Verstecktes Textfeld zum Speichern der zu sortierenden Listenspalte

txtTyp

Verstecktes Textfeld zum Festlegen, ob Datei oder Verzeichnis ausgewählt ist

Tab. 1: Steuerelemente des Formulars frmDateimanager

Um das Kombinationsfeld mit den nötigen Daten zu füllen, benötigen Sie eine Prozedur, die beim Öffnen des Formulars ausgelöst wird.

Die Prozedur (s. Quellcode 1) deklariert zunächst die Objektvariablen für das FileSystemObject namens objFSO und für ein Drive-Objekt namens objDrive sowie die Zeichenkette, die zum Zusammenstellen der Wertliste verwendet wird.

Anschließend wird die FileSystemObject-Objektvariable initiiert. In einer For Each-Schleife werden alle Laufwerke des FileSystemObjects durchlaufen und die Laufwerksbuchstaben mit Hilfe der Eigenschaft DriveLetter ermittelt und an die String-Variable strLaufwerke angehängt.

Für das Diskettenlaufwerk hängt die Anweisung beispielsweise den Ausdruck ;a;a: an die Zeichenkette strLaufwerke an. Nach dem späteren Abschneiden des führenden Semikolons bliebe also a;a: über.

Die zweimalige Verwendung der Eigenschaft DriveLetter und damit des Laufwerkbuchstabens erfolgt nicht zufällig: Der Buchstabe soll einmal unsichtbar als Wert der gebundenen Spalte und einmal als Ausgabewert sichtbar im Kombinationsfeld untergebracht werden. Den Grund für die Verwendung des Laufwerkbuchstabens als Wert der gebundenen Spalte erfahren Sie weiter unten.

Die nachfolgende Anweisung fügt zusätzlich für jedes Laufwerk die Art des Datenträgers an die Zeichenkette an. Anschließend wird der Inhalt der String-Variablen dem Kombinationsfeld zugewiesen. Damit das gefüllte Kombinationsfeld beispielsweise wie in Abb. 3 aussieht, müssen Sie die erste Spalte, die den gebundenen Wert enthält, aus- und die zweite Spalte einblenden. Dazu ändern Sie die Werte der Eigenschaften Spaltenanzahl auf 2 und Spaltenbreiten auf 0cm;3cm ab.

Natürlich können Sie die Anzeige noch ein wenig verfeinern - z. B. durch die Ausgabe des Datenträgernamens, des freien und des gesamt verfügbaren Speicherplatzes, des Filesystems (NTFS, Fat usw.) und anderer Eigenschaften.

Für das Auslesen dieser Eigenschaften ist die Kenntnis des Laufwerktyps erforderlich, da verschiedene Eigenschaften nur für manche Laufwerktypen zur Verfügung stehen. So können Sie beispielsweise nicht das Filesystem eines Netzlaufwerkes ermitteln.

Tabelle 2 enthält eine Auflistung der gängigsten Laufwerktypen und deren Konstanten.

Laufwerksinformationen anzeigen

Zu jedem Laufwerk gibt es unterschiedliche Arten von Informationen - für eine lokale Festplatte gibt z. B. die Eigenschaft VolumeName, für ein Netzlaufwerk die Eigenschaft ShareName die Bezeichnung des Laufwerks an.

Private Sub Form_Load()

    Dim objFSO As Scripting.FileSystemObject

    Dim objLaufwerk As Scripting.Drive

    Dim strLaufwerke As String

    Set objFSO = New FileSystemObject

    On Error Resume Next

    For Each objLaufwerk In objFSO.Drives

        strLaufwerke = strLaufwerke & ";" & _
            objLaufwerk.DriveLetter & ";" & _
            objLaufwerk.DriveLetter & ":"

        strLaufwerke = strLaufwerke & _

            Choose(objLaufwerk.DriveType + 1, _
            "Unbekannt", "Diskettenlaufwerk", _
            "Lokale Festplatte", "Netzlaufwerke", _
            "CD-Laufwerke u.ä.", "Ram-Disk")

    Next

    Me.cboLaufwerke.RowSource = Mid(strLaufwerke, 2, _
        Len(strLaufwerke) - 1)

    Me.txtVerzeichnis = "c:\"

    Me.cboLaufwerke.Value = "c"

    Me.lstOrdner.SetFocus

End Sub

Quellcode 1

Abb. 3: Auswahl eines Laufwerks per Kombinationsfeld

Laufwerktyp

Konstante(Wert)

Unbekannt

Unknown (0)

Diskettenlaufwerk

Removable (1)

Lokale Festplatte

Fixed (2)

Netzlaufwerk

Remote (3 )

CD-Laufwerk u. Ä.

CDRom (4)

Ram-Disk

RamDisk (5)

Tab. 2: Laufwerktypen und deren Konstanten

Abb. 4: Anzeige von Laufwerksinformationen

Die unterschiedlichen Eigenschaften sollen in dafür vorgesehenen Textfeldern dargestellt werden (s. Abb. 4). Da die Zuweisung der Eigenschaften zu den Textfeldern relativ trivial ist, wird sie an dieser Stelle nicht genauer beschrieben.

Ordner und
Dateien anzeigen

Ein Laufwerk kann Ordner und/oder Dateien enthalten. In den Ordnern können sich weitere Unterordner und/oder Dateien befinden. Ähnlich wie im Windows Explorer sollen nun zwei Fenster verwendet werden. Das linke Fenster enthält alle des im Textfeld txtVerzeichnisse angegebenen Verzeichnisses enthaltene Ordner. Das rechte Fenster soll alle Dateien des im Textfeldes txtVerzeichnisse angegebenen Ordners anzeigen.

Hinweis

Die Ansicht von Verzeichnissen und Dateien ist eine perfekte Anwendung für das Treeview-Control, das Sie in der vorherigen Ausgabe von Access im Unternehmen kennen gelernt haben. Da allerdings nicht jeder Leser im Besitz dieses Steuerelements ist, finden Sie hier eine Lösung, die zwar nicht so komfortabel ist, aber keine weiteren Steuerelemente benötigt. (

Verzeichnisse anzeigen

Die Anzeige der Verzeichnisse ist nicht unbedingt trivial, da es unterschiedliche Möglichkeiten gibt.

Die vom Programmieraufwand her einfachste Möglichkeit ist das Speichern der Verzeichnisse in einer Tabelle, die dem Listenfeld als Datenherkunft dient und anschließend wieder gelöscht wird. Der Nachteil ist, dass die Datenbank sich ohne regelmäßiges Komprimieren schnell vergrößern wird.

Die zweite Möglichkeit ist das Speichern der durch Semikola getrennten Verzeichnisse in einer Zeichenkette. Das Listenfeld kann die Zeichenkette als Wertliste anzeigen. Wertlisten sind jedoch auf 2.048 Zeichen beschränkt.

Da aber die Anzahl der anzuzeigenden Verzeichnisse und damit auch die Zeichenzahl theoretisch nur durch den Festplattenspeicher begrenzt ist, fällt diese Möglichkeit aus.

Die dritte und hier angewendete Möglichkeit besteht in dem Einlesen der Verzeichnisse in eine temporäre Datensatzgruppe. Diese erlaubt gleichzeitig die einfache Sortierung der Einträge nach unterschiedlichen Kriterien. Zur Übertragung der Daten in das Listenfeld verwenden Sie eine Callback-Funktion.

Hinweis

Die Funktionsweise und Anwendung von Callback-Funktionen wird detailliert im Beitrag Kombinations- und Listenfelder bevölkern der vorliegenden Ausgabe von Access im Unternehmen erläutert. (

Hinweis

Temporäre Datensatzgruppen - in diesem speziellen Fall ohne Bindung an eine Datenherkunft - sind mit DAO nicht möglich. Daher sollten Sie, falls Sie mit Access 97 arbeiten, die ADO-Bibliothek durch Setzen eines entsprechenden Verweises in die Datenbank einbinden. Wie dies funktioniert, erfahren Sie im Beitrag Verweise auf Bibliotheken setzen, den Sie auf der Heft-CD finden. (

Einmal in eine Datensatzgruppe eingelesen, können Sie beliebige Sortierungen der Daten durchführen - z. B. nach dem Alphabet.

Quellcode 2 enthält die Funktion VerzeichnisseEinlesen. Interessant ist der Initialisierungsteil der Callback-Funktion. Nach dem Deklarationsteil weist die Funktion der Variablen Pfad zunächst das aktuell im Textfeld txtVerzeichnis angezeigte Verzeichnis zu und ergänzt den Wert ggf. um einen Backslash (\). Anschließend erstellt sie eine temporäre Datensatzgruppe namens rstVerzeichnisse mit den zwei Feldern ID und Verzeichnisname.

Die Anweisungen innerhalb der nun folgenden For Each-Schleife lesen alle Unterverzeichnisse des in der Variablen Pfad gespeicherten Verzeichnisses in die Datensatzgruppe ein.

Die folgende If Then Else-Abfrage überprüft, wie die Prozedur die Daten sortieren soll. Beim ersten Aufruf der Funktion führt diese eine aufsteigende Sortierung durch.

Nach der Sortierung erfolgt eine Durchnummerierung der Datensätze im Feld ID. Dies ist deshalb wichtig, weil die Callback-Funktion die Datensätze später über die ID ausliest.

Das Einlesen der Datensätze erfolgt in dem durch die Anweisung Case acLBGetValue eingeleiteten Teil der Funktion. Dieser Teil wird für jeden Datensatz einmal aufgerufen.

Function VerzeichnisseEinlesen(Feld As Control, ID As Variant, Zeile As Variant, _
    Spalte As Variant, Code As Variant) As Variant

    Static rstVerzeichnisse As ADODB.Recordset

    Static i As Integer

    Dim Rueckgabewert As Variant

    Dim Pfad As String

    Dim objFSO As Scripting.FileSystemObject

    Dim objVerzeichnis As Scripting.folder

    Select Case Code

        Case acLBInitialize

            i = 0

            Pfad = Nz(Me.txtVerzeichnis, "C:\") & IIf(Right(Pfad, 1) = "\", "", "\")

            Set objFSO = New FileSystemObject

            Set rstVerzeichnisse = New ADODB.Recordset

                With rstVerzeichnisse

                Set .ActiveConnection = Nothing

                    .Fields.Append "ID", adInteger, 10, adFldIsNullable

                    .Fields.Append "Verzeichnisname", adWChar, 255, adFldIsNullable

                    .Open

                    For Each objVerzeichnis In objFSO.GetFolder(Pfad).SubFolders

                        .AddNew

                        !Verzeichnisname = objVerzeichnis.Name

                        .Update

                    Next objVerzeichnis

                    If IsNull(Me.txtSortierfeld) Then

                        .Sort = "[Verzeichnisname]"

                    Else

                        .Sort = "[" & Me.txtSortierfeld & "]" & Me("txtSort" & _
                            Me.txtSortierfeld)

                    End If

                    If Not .EOF Then .MoveFirst

                    Do While Not .EOF

                        i = i + 1

                        !ID = i

                        .Update

                        .MoveNext

                    Loop

                End With

                Rueckgabewert = i

        Case acLBOpen: Rueckgabewert = Timer

        Case acLBGetRowCount: Rueckgabewert = i

        Case acLBGetColumnCount: Rueckgabewert = 1

        Case acLBGetColumnWidth: Rueckgabewert = -1

        Case acLBGetValue

            rstVerzeichnisse.MoveFirst

            rstVerzeichnisse.Filter = "ID = " & Zeile + 1

            Rueckgabewert = rstVerzeichnisse!Verzeichnisname

        Case acLBGetFormat

        Case acLBEnd: Set rstVerzeichnisse = Nothing

    End Select

    VerzeichnisseEinlesen = Rueckgabewert

End Function

Quellcode 2

Die Funktion filtert zunächst die Datensatzgruppe nach der aktuellen ID und fügt dem Listenfeld anschließend den Namen des entsprechenden Verzeichnisses hinzu.

Abb. 5: Anzeige von Verzeichnissen und Dateien

Damit die Funktion ihren Dienst tut und das entsprechende Listenfeld mit den Daten füllt, müssen Sie den Funktionsnamen für die Eigenschaft Herkunftsart eintragen. Anschließend sollte die Anzeige der Daten z. B. wie in Abb. 5 aussehen.

Dateien anzeigen

Das Listenfeld lstDateien soll alle Dateien des im Textfeld txtVerzeichnis angezeigten Verzeichnisses anzeigen.

Auch dieses Listenfeld hat eine Callback-Funktion als Datenherkunft. Die Funktion heißt DateienEinlesen und ist fast mit der soeben beschriebenen Funktion identisch. Es gibt lediglich die folgenden Unterschiede:

  • File-Objekt zur Ermittlung von Dateien statt Folder-Objekt zur Ermittlung von Verzeichnissen
  • Anzeige von vier statt nur zwei Feldern: ID, Dateiname, Größe und Änderungsdatum statt nur der ID und dem Verzeichnisnamen
  • Der Aufbau und die Funktionsweise der Funktion DateienEinlesen entsprechen weitgehend der Funktion VerzeichnisseEinlesen. Aus Platzgründen wird daher auf eine separate Beschreibung der Funktion verzichtet.

    Daten sortieren

    Wie beim Windows-Explorer soll auch der Dateimanager die Möglichkeit bieten, Dateien und Verzeichnisse zu sortieren. Daher legen Sie zunächst einige Beschriftungsfelder entsprechend Abb. 5 oberhalb der Listenfelder an.

    Außerdem benötigen Sie die fünf versteckten Textfelder txtSortierfeld, txtSortVerzeichnisname, txtSortDateiname, txtSortGroesse, txtSortAenderung.

    Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    Verwandte Beiträge:

    Zippen ohne Zusatzkomponente

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.