Tipp 1.6 - Dateien ermitteln

Wie kann ich alle Dateien und Ordner in einem Ordner ermitteln?

Mit dieser Funktion können Sie alle Dateien und Ordner in einem Ordner ermitteln. Kopieren Sie einfach nachfolgenden Quellcode in die Zwischenablage und fügen Sie anschließend den Inhalt der Zwischenablage in ein neues Modul ein. Die Aufrufparameter finden Sie im Quellcode beschrieben.

Api-AufrufeVerwendete Win32-Api-Aufrufe und Typen: GetFileAttributes, FindFirstFile, FindNextFile, FindClose - FILETIME, WIN32_FIND_DATA

Beispiel:

Option Explicit
 
Private Const INVALID_HANDLE_VALUE  As Long = (-1&)
Private Const ERROR_NO_MORE_FILES   As Long = 18&
Private Const API_FALSE             As Long = 0&
Private Const MAX_PATH              As Long = 260&
 
Private Type FILETIME
  dwLowDateTime          As Long
  dwHighDateTime         As Long
End Type
 
Private 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 * MAX_PATH
  cAlternate             As String * 14
End Type
 
Private Declare Function GetFileAttributes _
    Lib "kernel32" Alias _
    "GetFileAttributesA" _
    (ByVal lpFileName As String) As Long
 
Private Declare Function FindFirstFile _
    Lib "kernel32" Alias _
    "FindFirstFileA" _
    (ByVal lpFileName As String, _
    lpFindFileData As WIN32_FIND_DATA) As Long
 
Private Declare Function FindNextFile _
    Lib "kernel32" Alias _
    "FindNextFileA" _
    (ByVal hFindFile As Long, _
    lpFindFileData As WIN32_FIND_DATA) As Long
 
Private Declare Function FindClose _
    Lib "kernel32" _
    (ByVal hFindFile As Long) As Long
 
Public Function FindFilesInFolder( _
                ByVal sPath As String) _
                As Variant
  '// -----------------------------------------------------
  '// Funktion:  | Funktion ermittelt alle Einträge in
  '//            | einem Ordner; in dieser Version werden
  '//            | auch Ordner ermittelt und für die
  '//            | Rückgabe in eckige Klammern gesetzt.
  '//            | Sollen keine Ordner zurückgegeben
  '//            | werden, muss die entsprechende Stelle
  '//            | auskommentiert werden.
  '// -----------------------------------------------------
  '// Parameter: | sPath = Ordner,
  '//            |         dessen Inhalte gesucht werden
  '// -----------------------------------------------------
  '// Rückgabe:  | bei Erfolg, wird ein String-Array
  '//            | zurückgegeben
  '// -----------------------------------------------------
  '// Autor:     | Stefan Kulpa
  '//            | EDV Innovation & Consulting - Dormagen
  '// -----------------------------------------------------
  '// Beispiel:
  '// Dim lCount  As Long
  '// Dim asFiles As Variant
  '// asFiles = FindFilesInFolder("C:\WINDOWS")
  '// If IsArray(asFiles) Then
  '//     For lCount = LBound(asFiles) To UBound(asFiles)
  '//         Debug.Print asFiles(lCount)
  '//     Next
  '// End If
  '// -----------------------------------------------------
 
  Dim uFindData   As WIN32_FIND_DATA
  Dim asResults() As String
  Dim sFileName   As String
  Dim lCounter    As Long
  Dim lFileSearch As Long
 
  '// -----------------------------------------------------
  '// Prüfen, ob der Suchordner existiert
  '// -----------------------------------------------------
  If FileFolderExists(sPath) Then
    '// ---------------------------------------------------
    '// Für die API-Funktion auf endenden Backslash prüfen
    '// und ggf. anhängen
    '// ---------------------------------------------------
    If Right$(sPath, 1) <> "\" Then sPath = sPath & "\"
    '// ---------------------------------------------------
    '// Ersten Eintrag suchen (i.d.R. ".")
    '// ---------------------------------------------------
    lFileSearch = FindFirstFile(sPath & "*.*", uFindData)
    If lFileSearch <> INVALID_HANDLE_VALUE Then
      Do
        '// -----------------------------------------------
        '// API-Rückgabestring "bereinigen"
        '// -----------------------------------------------
        sFileName = StripNulls(uFindData.cFileName)
        '// -----------------------------------------------
        '// Ordner in eckige Klammern setzen
        '// -----------------------------------------------
        If uFindData.dwFileAttributes And vbDirectory Then
          sFileName = "[" & sFileName & "]"
        End If
        '// -----------------------------------------------
        '// Trefferzähler hochsetzen und Array für die
        '// Rückgabe vergrößern
        '// -----------------------------------------------
        lCounter = lCounter + 1
        ReDim Preserve asResults(lCounter)
        '// -----------------------------------------------
        '// Aktuellen Treffer in das Array schreiben
        '// -----------------------------------------------
        asResults(lCounter - 1) = sFileName
        If FindNextFile(lFileSearch, _
            uFindData) = API_FALSE Then
          '// ---------------------------------------------
          '// Gibt es keine Treffer mehr,Schleife verlassen
          '// ---------------------------------------------
          If Err.LastDllError = ERROR_NO_MORE_FILES Then
            Call FindClose(lFileSearch)
            Exit Do
          End If
        End If
      Loop
    End If
  End If
  '// -----------------------------------------------------
  '// Wurden Einträge gefunden, Funktionsrückgabe
  '// durchführen und Array löschen
  '// -----------------------------------------------------
  If lCounter > 0 Then
    FindFilesInFolder = asResults
    Erase asResults
  End If
 
End Function
 
Private Function FileFolderExists( _
                 ByVal sFileName As String) _
                 As Boolean
  '// -----------------------------------------------------
  '// Funktion:  | Hilfsfunktion ermittelt, ob eine
  '//            | Datei oder ein Ordner existiert
  '// -----------------------------------------------------
  '// Parameter: | sFileName = zu prüfende(r) Datei/Ordner
  '// -----------------------------------------------------
  '// Rückgabe:  | True, wenn es die Datei/den Ordner gibt
  '//            | sonst False
  '// -----------------------------------------------------
 
  Dim uFindData   As WIN32_FIND_DATA
  Dim lFile       As Long
  '// -----------------------------------------------------
  '// Mögliche Leerzeichen entfernen
  '// -----------------------------------------------------
  sFileName = Trim$(sFileName)
  '// -----------------------------------------------------
  '// Datei/Ordner suchen
  '// -----------------------------------------------------
  lFile = FindFirstFile(sFileName, uFindData)
  If (lFile <> INVALID_HANDLE_VALUE) And _
      (lFile <> ERROR_NO_MORE_FILES) Then
    FileFolderExists = True
  ElseIf GetFileAttributes(sFileName) <> (-1) Then
    '// ---------------------------------------------------
    '// FindFirstFile gibt nicht das Rootverzeichnis wieder
    '// daher explizit prüfen, ob es sich um ein
    '// Rootverzeichnis handelt
    '// ---------------------------------------------------
    FileFolderExists = True
  End If
  Call FindClose(lFile)
 
End Function
 
Public Function StripNulls( _
                ByVal sText As String) _
                As String
  '// -----------------------------------------------------
  '// Funktion:  | Hilfsfunktion zum "Klären" eines API-
  '//            | Rückgabestring
  '// -----------------------------------------------------
  '// Parameter: | sText = zu prüfender API-Rückgabestring
  '// -----------------------------------------------------
  '// Rückgabe:  | bereinigter String
  '// -----------------------------------------------------
 
  Dim lPos As Long
  StripNulls = sText
  lPos = InStr(sText, vbNullChar)
  If lPos Then StripNulls = Left$(sText, lPos - 1)
  If Len(sText) > 0 Then
    If Left$(sText, 1) = vbNullChar Then _
        StripNulls = vbNullString
  End If
 
End Function