Ja, VB6.
Ich suche in meinem Programm nach allen Dateien in einem bestimmten Ordner, die eine definierte Dateiendung haben (in meinem Fall
Leider weiß ich einfach nicht, warum das so ist. In meinen Augen ist mein Code korrekt. Ich verwende die Standard-Windows-API dafür.
Hier die relevanten Teile:
Public Function FindFile (...)
Aufgerufen wird die Suche so:
Bei meiner Recherche bin ich auf folgende Seite gestoßen, die aber vmtl. ein ganz anderes Problem bebandelt (oder doch dasselbe?):
codeguru.com/cpp/w-p/files/art…recated-DOS-Wildcards.htm
Hat jemand eine Idee? Liegt es an meinem Code oder an der Windows-API?
Ich suche in meinem Programm nach allen Dateien in einem bestimmten Ordner, die eine definierte Dateiendung haben (in meinem Fall
*.mdf
). Leider findet die Routine auch alle Dateien, die die Endung *.mdf2
haben.Leider weiß ich einfach nicht, warum das so ist. In meinen Augen ist mein Code korrekt. Ich verwende die Standard-Windows-API dafür.
Hier die relevanten Teile:
Visual Basic-Quellcode
- Public Function FindFile(ByVal StartPath As String, _
- ByVal SearchSubfolder As Boolean, _
- ByVal file As String, _
- ByRef FileFound() As Datei)
- ' Suchroutine: Wildcards sind erlaubt (*.*, ?, ect.)
- Dim hFile As Long
- Dim FileData As WIN32_FIND_DATA
- Dim Directories() As String
- Dim OnlyDirectories As Boolean
- Dim TmpFile As String
- Dim i As Integer
- DoEvents
- ' Evtl. Backslash entfernen
- If Right$(StartPath, 1) = "\" Then _
- StartPath = Left$(StartPath, Len(StartPath) - 1)
- SearchOnlySubfolders:
- ' Sucht nach einer Datei, und packt das
- ' Ergebnis in FileData
- hFile = FindFirstFile(StartPath & "\" & file & _
- vbNullChar, FileData)
- ' Wenn sie gefunden wurde, dann...
- If hFile <> INVALID_HANDLE_VALUE Then
- Do
- ' Ist es ein Verzeichniss oder eine Datei ?
- With FileData
- If (.dwFileAttributes And vbDirectory) = 0 Then
- ' Datei
- ' Nur wenn nicht nur Verzeichinsse gesucht werden
- If Not OnlyDirectories Then
- ' Array vergrößern und Daten ins Array schreiben
- On Local Error GoTo Err_DimFile
- ReDim Preserve FileFound(UBound(FileFound) + 1)
- On Local Error GoTo 0
- DoEvents
- UmPacken FileFound(UBound(FileFound)), _
- FileData, StartPath & "\" & file
- End If
- ElseIf SearchSubfolder = True Then
- ' Verzeichnis
- ' Verzeichnis nur im Array Speichern wenn es
- ' über dem jetzigen liegt d.h. ".." "." sind
- ' nicht gültig
- If Left$(.cFileName, InStr(.cFileName, vbNullChar) - 1) <> "." _
- And Left$(.cFileName, InStr(.cFileName, vbNullChar) - 1) <> ".." Then
- On Local Error GoTo Err_DimDir
- ReDim Preserve Directories(UBound(Directories) + 1)
- On Local Error GoTo 0
- ' Verzeichnis dem Array hinzufügen
- Directories(UBound(Directories)) = _
- Left$(.cFileName, InStr(.cFileName, vbNullChar) - 1)
- End If
- End If
- End With
- DoEvents
- Loop Until FindNextFile(hFile, FileData) = 0
- End If
- FindClose hFile
- ' Unteroder durchsuchen
- On Local Error GoTo Err_DimDir
- If SearchSubfolder = False Then Exit Function
- On Local Error GoTo 0
- ' Wenn nach anderen Dateien als *.* gesucht wird,
- ' werden keine Ordner gefunden
- ' Deshalb noch einmal gezielt nach Ordnern suchen
- If Not OnlyDirectories And SearchSubfolder = True And file <> "*.*" Then
- OnlyDirectories = True
- TmpFile = file
- file = "*.*"
- GoTo SearchOnlySubfolders
- ElseIf TmpFile <> vbNullString Then
- file = TmpFile
- End If
- On Local Error GoTo Err_Exit
- For i = 0 To UBound(Directories)
- DoEvents
- ' Hier ruft die Funktion sich selbst auf - für
- ' jeden Unterordner
- FindFile StartPath & "\" & Directories(i), _
- SearchSubfolder, file, FileFound
- Next i
- Exit Function
- Err_DimFile:
- ReDim FileFound(0)
- Resume Next
- Err_DimDir:
- ReDim Directories(0)
- Resume Next
- Err_Exit:
- End Function
Aufgerufen wird die Suche so:
Visual Basic-Quellcode
- '[...]
- Private Const FileExt As String = ".mdf"
- '[...]
- Public Type Datei
- Pfadname As String
- DosDateiname As String
- Dateiname As String
- ErstelltAM As FILETIME
- LetzterZugriff As FILETIME
- LetzeÄnderung As FILETIME
- DateiGröße As Long
- Atribute As Long
- End Type
- '[...]
- Dim FileList() As Datei
- '[...]
- ' SUCHE STARTEN
- FindFile AppPath & "MaterialData", False, "*" & FileExt, FileList
Bei meiner Recherche bin ich auf folgende Seite gestoßen, die aber vmtl. ein ganz anderes Problem bebandelt (oder doch dasselbe?):
codeguru.com/cpp/w-p/files/art…recated-DOS-Wildcards.htm
Hat jemand eine Idee? Liegt es an meinem Code oder an der Windows-API?