Dateisuche nach *.ext findet auch *.ext2

  • VB6

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Dateisuche nach *.ext findet auch *.ext2

    Ja, VB6. ;)

    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:

    Public Function FindFile (...)

    Visual Basic-Quellcode

    1. Public Function FindFile(ByVal StartPath As String, _
    2. ByVal SearchSubfolder As Boolean, _
    3. ByVal file As String, _
    4. ByRef FileFound() As Datei)
    5. ' Suchroutine: Wildcards sind erlaubt (*.*, ?, ect.)
    6. Dim hFile As Long
    7. Dim FileData As WIN32_FIND_DATA
    8. Dim Directories() As String
    9. Dim OnlyDirectories As Boolean
    10. Dim TmpFile As String
    11. Dim i As Integer
    12. DoEvents
    13. ' Evtl. Backslash entfernen
    14. If Right$(StartPath, 1) = "\" Then _
    15. StartPath = Left$(StartPath, Len(StartPath) - 1)
    16. SearchOnlySubfolders:
    17. ' Sucht nach einer Datei, und packt das
    18. ' Ergebnis in FileData
    19. hFile = FindFirstFile(StartPath & "\" & file & _
    20. vbNullChar, FileData)
    21. ' Wenn sie gefunden wurde, dann...
    22. If hFile <> INVALID_HANDLE_VALUE Then
    23. Do
    24. ' Ist es ein Verzeichniss oder eine Datei ?
    25. With FileData
    26. If (.dwFileAttributes And vbDirectory) = 0 Then
    27. ' Datei
    28. ' Nur wenn nicht nur Verzeichinsse gesucht werden
    29. If Not OnlyDirectories Then
    30. ' Array vergrößern und Daten ins Array schreiben
    31. On Local Error GoTo Err_DimFile
    32. ReDim Preserve FileFound(UBound(FileFound) + 1)
    33. On Local Error GoTo 0
    34. DoEvents
    35. UmPacken FileFound(UBound(FileFound)), _
    36. FileData, StartPath & "\" & file
    37. End If
    38. ElseIf SearchSubfolder = True Then
    39. ' Verzeichnis
    40. ' Verzeichnis nur im Array Speichern wenn es
    41. ' über dem jetzigen liegt d.h. ".." "." sind
    42. ' nicht gültig
    43. If Left$(.cFileName, InStr(.cFileName, vbNullChar) - 1) <> "." _
    44. And Left$(.cFileName, InStr(.cFileName, vbNullChar) - 1) <> ".." Then
    45. On Local Error GoTo Err_DimDir
    46. ReDim Preserve Directories(UBound(Directories) + 1)
    47. On Local Error GoTo 0
    48. ' Verzeichnis dem Array hinzufügen
    49. Directories(UBound(Directories)) = _
    50. Left$(.cFileName, InStr(.cFileName, vbNullChar) - 1)
    51. End If
    52. End If
    53. End With
    54. DoEvents
    55. Loop Until FindNextFile(hFile, FileData) = 0
    56. End If
    57. FindClose hFile
    58. ' Unteroder durchsuchen
    59. On Local Error GoTo Err_DimDir
    60. If SearchSubfolder = False Then Exit Function
    61. On Local Error GoTo 0
    62. ' Wenn nach anderen Dateien als *.* gesucht wird,
    63. ' werden keine Ordner gefunden
    64. ' Deshalb noch einmal gezielt nach Ordnern suchen
    65. If Not OnlyDirectories And SearchSubfolder = True And file <> "*.*" Then
    66. OnlyDirectories = True
    67. TmpFile = file
    68. file = "*.*"
    69. GoTo SearchOnlySubfolders
    70. ElseIf TmpFile <> vbNullString Then
    71. file = TmpFile
    72. End If
    73. On Local Error GoTo Err_Exit
    74. For i = 0 To UBound(Directories)
    75. DoEvents
    76. ' Hier ruft die Funktion sich selbst auf - für
    77. ' jeden Unterordner
    78. FindFile StartPath & "\" & Directories(i), _
    79. SearchSubfolder, file, FileFound
    80. Next i
    81. Exit Function
    82. Err_DimFile:
    83. ReDim FileFound(0)
    84. Resume Next
    85. Err_DimDir:
    86. ReDim Directories(0)
    87. Resume Next
    88. Err_Exit:
    89. End Function


    Aufgerufen wird die Suche so:

    Visual Basic-Quellcode

    1. '[...]
    2. Private Const FileExt As String = ".mdf"
    3. '[...]
    4. Public Type Datei
    5. Pfadname As String
    6. DosDateiname As String
    7. Dateiname As String
    8. ErstelltAM As FILETIME
    9. LetzterZugriff As FILETIME
    10. LetzeÄnderung As FILETIME
    11. DateiGröße As Long
    12. Atribute As Long
    13. End Type
    14. '[...]
    15. Dim FileList() As Datei
    16. '[...]
    17. ' SUCHE STARTEN
    18. 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?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ich vermute, dass du genau auf den verlinkten Bug gestoßen bist. Abhilfe steht auch drunter: 8.3-Dateinamen deaktivieren. Falls das nicht geht (weil der Rechner einem Kunden gehört, etc.): Nimm die Dateiliste, wie sie ist und filtere sie nochmal manuell mit dem Like-Operator. Das könntest du in der Funktion "UmPacken" machen, wo die Liste vmtl. sowieso komplett durchlaufen wird.
    Gruß
    hal2000
    Es handelt sich schon um meinen PC, allerdings würde mir das Deaktivieren der 8.3-Dateinamen nichts bringen, weil es dann nur bei mir geht. Das Programm wird aber an andere Personen gehen und dort muss es natürlich auch laufen.

    Aber dein Tipp war gut, ich frage nun das Suchergebnis (die Dateiliste) am Ende, bevor dieses verwendet wird, nochmal erneut ab (Beispiel):

    Visual Basic-Quellcode

    1. For i = 0 To u
    2. If FileList(i).Dateiname Like "*" & FileExt Then ' Dieses IF ist neu!
    3. .AddItem Replace$(FileList(i).Dateiname, FileExt, vbNullString)
    4. .ItemData(.ListCount - 1) = -3
    5. End If
    6. Next i

    Danke! :)
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum