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.
Verwendete 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