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 1/2003.

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 einlesen und finden mit Access

Christoph Spielmann, Düsseldorf, und Klaus Gießen, Wuppertal

Die Speicherkapazität von Festplatten hat gerade in den letzten Jahren rasant zugenommen. Momentan sind Festplatten mit 80 bis 100 MB handelsüblich, und Festplatten mit mehreren Terabyte für normale PC-Systeme bereits im Gespräch. Mit zunehmender Größe des zur Verfügung stehenden Speicherplatzes wächst erfahrungsgemäß auch die Anzahl der gespeicherten Dateien. Folglich wird die Suche nach bestimmen Dateien in solch großen Datenbeständen mit den üblichen Dateimanagern, wie beispielsweise dem Windows-Explorer, immer unübersichtlicher und schwieriger - und vor allem: wesentlich zeitaufwendiger. Die hier vorgestellte Lösung zeigt Ihnen, wie Sie umfangreiche Datenbestände mit Hilfe von Access in den Griff bekommen.

Das Organisieren von Datenbeständen ist eine der bekannten Domänen von Datenbanksystemen wie Access. Also liegt die Verwendung einer entsprechend gestalteten Datenbank zur Verwaltung und zur Suche nach Dateien nahe.

Auch Microsoft ist inzwischen auf diese Idee gekommen und hat bereits den Nachfolger des SQL Servers 2000 (Codename Yukon) als Ersatz für das Dateisystem des Windows-XP-Nachfolgers Longhorn angekündigt.

Die daraus resultierenden Vorteile werden sicherlich revolutionär sein. So wird es beispielsweise möglich, z. B. eine Datei mit Daten zu Ihrer Steuererklärung gleichzeitig unter den Pfaden EKSteuer/2002 und 2002/Steuer/EK abzulegen.

Dass die Suche nach Dateien bei Einsatz einer Datenbank sehr schnell vonstatten geht, versteht sich hierbei von selbst - und das ist auch einer der wesentlichen Aspekte der vorgestellten Lösung. Wer gelegentlich verschollen geglaubte Dateien auf einer großen Festplatte mit vielen Daten sucht, wird gerade den Geschwindigkeitsvorteil zu schätzen wissen.

Um Ihnen die Wartezeit bis zum Erscheinen von Longhorn etwas zu versüßen, stellen wir Ihnen hier eine Lösung namens FileScanner für Access vor, die zumindest die Suche nach Dateien dramatisch beschleunigt.

Der Einsatzbereich dieser Lösung umfasst in erster Linie Festplattenlaufwerke - lokal oder im Netzwerk.

Die Archivierung von CD-ROMs und anderen Medien ist sicher sinnvoll, wird aber im Rahmen des vorliegenden Beitrags nicht behandelt.

Hinweis

Sie finden die Beispieldatenbank der Musterlösung FileScanner für Access 2000 und höher auf der beiliegenden CD-ROM unter dem Dateinamen FileScanner.mdb. (

Eine Version einer Musterlösung für Access 97 liegt leider nicht vor, da der Programmcode von Klassenmodulen ausgelöste Ereignisse verwendet.

Dieses Feature steht erst ab Access 2000 zur Verfügung.

Anforderungen an die
FileScanner-Lösung

Die wichtigste Forderung bei der Entwicklung des FileScanners ist das schnelle Auffinden von Dateien auf Medien mit festen Pfaden wie beispielsweise Festplatten auf lokalen oder Netzwerkrechnern.

Die Kernfunktion ist dementsprechend das Einlesen von Laufwerken mit allen Verzeichnissen und Unterverzeichnissen. Zusätzlich stellt die hier vorgestellte Datenbank ein Formular zur Suche nach Dateien sowie zum Öffnen einer gefundenen Datei direkt aus der Datenbank heraus zur Verfügung. Eine .mdb-Datei wird beim Anklicken beispielsweise mit Access geöffnet.

Das Datenmodell

Das Datenmodell des FileScanners besteht aus einer einzigen Tabelle namens tblFiles, deren Entwurfsansicht Sie in Abb. 1 finden.

Abb. 1: Die Tabelle tblFiles in der Entwurfsansicht

Einige Felder der Tabelle tblFiles weisen Besonderheiten auf:

  • Das Feld DirName hat den Felddatentyp Memo, um auch die Namen von tiefer geschachtelten Unterverzeichnissen speichern zu können. Die 255 Zeichen eines Textfelds reichen unter Umständen dafür nicht aus. Ein Blick auf Ihre eigene Verzeichnisstruktur dürfte dies eventuell deutlich machen.
  • Das Feld FileSize hat die Feldgröße Double, damit die Tabelle auch die Dateigröße sehr großer Dateien speichern kann.
  • Das boolesche Feld IsExisting stellt sicher, dass nach einem Scan alle nicht mehr existierenden Dateien - verschoben oder gelöscht - aus der Datenbank entfernt werden. Nähere Einzelheiten dazu finden Sie weiter unten.
  • Die Formulare der Musterlösung

    Die Beispiellösung enthält lediglich zwei Formulare und ein Unterformular, die Sie in den folgenden Abschnitten näher kennen lernen.

    Das Formular frmScan

    Das Formular frmScan steuert das Durchsuchen (Scannen) eines Laufwerks. Es enthält im Wesentlichen ein ungebundenes Textfeld zur Eingabe des Startverzeichnisses und zwei Schaltflächen (s. Abb. 2).

    Abb. 2: Das Formular frmScan in der Entwurfsansicht

    Weiterhin ist in diesem Formular noch ein ungebundenes Textfeld zur Anzeige von Statusmeldungen vorhanden. Dies ist sinnvoll, da das Einscannen eines Laufwerks je nach Anzahl der Dateien längere Zeit in Anspruch nehmen kann.

    Das Formular frmFind

    Das Formular frmFind erledigt die Suche nach einer Datei. Es enthält neben einem ungebundenen Textfeld zur Eingabe eines Suchbegriffs noch eine Schaltfläche zum Start der Suche (s. Abb. 3).

    Abb. 3: Das Dialogfenster Optionen

    Das Unterformular frmFind_Sub zeigt den Verzeichnis- und Dateinamen der gefundenen Dateien als Datenblatt an (Abb. 4).

    Damit haben Sie - abgesehen vom VBA-Code - schon alle Objekte der Musterlösung kennen gelernt.

    Einsatz des FileScanners

    Bevor wir Ihnen die Funktionsweise des FileScanners vorstellen, finden Sie in diesem Abschnitt zunächst seine Anwendung beschrieben.

    Abb. 4: Das Formular frmFind in der Entwurfsansicht

    Abb. 5: Entwurfsansicht des Unterformulars frmFind_Sub

    Vor dem Experimentieren beachten Sie jedoch Folgendes:

    Weil Sie in der Anfangsphase sicherlich häufig neue Scans durchführen und wieder löschen, sorgen Sie am besten für eine automatische Komprimierung der FileScanner-Datenbank beim Schließen. Hierzu gehen Sie wie folgt vor:

  • Öffnen Sie mit dem Menübefehl Extras/Optionen das Dialogfenster Optionen und aktivieren Sie das Register Allgemein.
  • Markieren Sie dann das Kontrollkästchen Beim Schließen komprimieren (s. Abb. 5). (
  • Dateien und Verzeichnisse einlesen

    Die Bedienung des FileScanners ist sehr einfach. Öffnen Sie das Formular frmScan und geben Sie in das Feld Start-Verzeichnis das gewünschte Laufwerk oder Verzeichnis ein.

    Mit einem Klick auf die Schaltfläche Start wird das Einlesen der Dateien gestartet (s. Abb. 6). Ausgangspunkt des Einlesevorgangs ist das von Ihnen eingegebene Laufwerk bzw. Verzeichnis. Von dort aus werden ebenfalls alle eventuell vorhandenen Unterverzeichnisse durchsucht.

    Praxis-Tipp

    Wenn Sie das Root-Verzeichnis einer größeren und gut gefüllten Festplatte als Startpunkt angeben, kann der Scan ohne Weiteres 10 bis 20 Minuten dauern. Fassen Sie sich also in Geduld oder brechen Sie den Einlesevorgang mit der Abbrechen-Schaltfläche ab. (

    Während des Suchvorgangs informiert Sie eine Statuszeile unterhalb der Schaltfläche Start über den Fortschritt des Einlesens (s. Abb. 7).

    Abb. 6: Das Formular frmScan

    Abb. 7: Statuszeile während des Suchvorgangs

    Das Ende des Suchvorgangs erkennen Sie in der Statuszeile des Formulars, die dann wieder den Schriftzug Bereit! anzeigt.

    Die eingelesenen Dateien sind danach mit den entsprechenden Angaben in der Tabelle tblFiles gespeichert (s. Abb. 8).

    Suchen

    Die Suche nach Dateien erfolgt vom Formular frmFind aus. Geben Sie in das Feld Suchen das gewünschte Suchkriterium ein und klicken Sie anschließend auf die Schaltfläche Suchen (s. Abb. 9).

    Abb. 8: Eingelesene Dateien in der Tabelle tblFiles

    Der FileScanner erlaubt die Anwendung folgender Suchkriterien:

  • Freier Text: kann sich auf die Suche nach einem Verzeichnis- bzw. Dateinamen oder auf die Dateiextension beziehen.
  • Dateierweiterung: Sie können beispielsweise gezielt nach gif-, txt-, doc- oder allen anderen Dateierweiterungen suchen.
  • Wildcard: Beim Suchkriterium *.* werden alle Verzeichnisse und Dateien als Suchergebnis angezeigt.
  • Das Suchergebnis

    Das Suchergebnis wird als Datenblatt angezeigt (s. Abb. 9). Die Anzeige beschränkt sich hierbei auf den Verzeichnis- und Dateinamen.

    Verzeichnis öffnen

    Ein Doppelklick in ein beliebiges Feld der Spalte Verzeichnis öffnet dieses Verzeichnis im Windows Explorer.

    Hinweis

    Einen entsprechenden Hinweis finden Sie in der Statuszeile unten im Formular. (

    Datei öffnen

    Ein Doppelklick auf einen Dateinamen öffnet die Datei zusammen mit der dazugehörigen Anwendung. Voraussetzung dafür ist allerdings, dass diese Dateiextension auch mit einer Anwendung verknüpft ist.

    Verwendete API-Funktionen

    Ein wesentlicher Teil der Funktionalität des FileScanners ist mit Hilfe von API-Funktionen realisiert, die Sie in den folgenden Abschnitt kennen lernen.

    Abb. 9: Suchergebnis im Unterformular

    Declare Function FindFirstFile Lib "kernel32.dll" _
        Alias "FindFirstFileA" (ByVal lpFileName As _
        String, lpFindFileData As WIN32_FIND_DATA) As Long

    Quellcode 1

    Declare Function FindNextFile Lib "kernel32.dll" _
        Alias "FindNextFileA" (ByVal hFindFile As Long, _
        lpFindFileData As WIN32_FIND_DATA) As Long

    Quellcode 2

    Public Type WIN32_FIND_DATA

        dwFileAttributes As Long

        ftCreationTime As FileTime

        ftLastAccessTime As FileTime

        ftLastWriteTime As FileTime

        nFileSizeHigh As Long

        nFileSizeLow As Long

        dwReserved0 As Long

        dwReserved1 As Long

        cFileName As String * 260

        cAlternate As String * 14

    End Type

    Quellcode 3

    Die Funktion FindFirstFile

    Die Funktion FindFirstFile beginnt eine Dateisuche und gibt Informationen über die erste gefundene Datei zurück. Dabei sucht die Funktion nach dem Dateinamen, der durch die Wildcards * oder ? ergänzt werden kann. Das Suchergebnis wird in der Variablen lpFindFileData gespeichert.

    Weiterhin gibt die Funktion ein Such-Handle zurück, welches bei Suche nach weiteren Suchtreffern mit Hilfe der Funktion FindNextFile benutzt wird.

    Die Deklaration der FindFirstFile-Funktion finden Sie in Quellcode 1.

    Die Funktion
    FindNextFile

    Die Funktion FindNextFile setzt eine mit der Funktion FindFirstFile begonnene Suche fort und speichert Informationen über weitere Suchtreffer ebenfalls in der Variablen lpFindFileData. Wenn alle Dateien eines Verzeichnisses aufgelistet werden sollen, muss einmal die Funktion FindFirstFile und danach mehrmals die Funktion FindNextFile aufgerufen werden. Sie finden die Deklaration der Funktion in Quellcode 2.

    Die Struktur _
    WIN32_FIND_DATA

    Die beiden Funktionen FindFirstFile und FindNextFile verwenden die Struktur WIN32_FIND_DATA zur Ablage des Suchergebnisses. Eine solche Struktur muss genau wie eine API-Funktion selbst im Deklarationsteil eines VBA-Moduls deklariert werden. Sie finden die Deklaration der Struktur in Quellcode 3.

    Sie erkennen hier die Variablen zur Speicherung der üblichen Dateiattribute wie Dateiname, letzter Zugriff usw.

    Declare Function FindClose Lib "kernel32.dll" _
        (ByVal hFindFile As Long) As Long

    Quellcode 4

    Declare Function FileTimeToSystemTime Lib _
        "kernel32.dll" (lpFileTime As FILETIME, _
        lpSystemTime As SYSTEMTIME) As Long

    Quellcode 5

    Declare Function ShellExecute Lib "shell32.dll" _
        Alias "ShellExecuteA" (ByVal hWnd As Long, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, _
        ByVal lpParameters As String, _
        ByVal _lpDirectory As String, _
        ByVal nShowCmd As Long) As Long

    Quellcode 6

    Private Sub btnStartScan_Click()

        Me.txtStartDir.Value = Trim(Me.txtStartDir.Value)

        If Len(Me.txtStartDir.Value) = 0 Then

            MsgBox "Bitte geben Sie ein Startverzeichnis " _
                & "an!"

            Exit Sub

        End If

        On Error Resume Next

        ChDir Me.txtStartDir.Value

        If Err.Number <> 0 Then

            MsgBox "Das Start-Verzeichnis ist ungültig"

            Exit Sub

        End If

        On Error GoTo 0

        If Right(Me.txtStartDir.Value, 1) = "\" Then

            Me.txtStartDir.Value = _
                Left(Me.txtStartDir.Value, _
                Len(Me.txtStartDir.Value) - 1)

        End If

        Me.txtStartDir.SetFocus

        Me.btnStartScan.Enabled = False

        Me.btnCancel.Enabled = True

        Set m_fs = New clsFileScanner

        m_fs.StartUpdate (Me.txtStartDir.Text)

        Me.btnStartScan.Enabled = True

        Me.btnCancel.Enabled = False

        Me.lblStatus.Caption = "Bereit!"

    End Sub

    Quellcode 7

    Der Vorteil bei der Verwendung einer solchen Struktur besteht darin, die benötigten Informationen quasi am Stück in einem Rutsch zu übergeben.

    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:

    Suchfunktionen von einfach bis komplex

    Zippen ohne Zusatzkomponente

    Globale Suche

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.