Anzahl von Dateien - incl. Subfolder aber ohne versteckte Dateien

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Anzahl von Dateien - incl. Subfolder aber ohne versteckte Dateien

    Moin!

    ich habe mir eine Funktion geschrieben um die Anzahl der Dateien zu ermitteln ab einem bestimmte Verzeichnis.

    VB.NET-Quellcode

    1. Public Function GetFilesCount(ByVal pFolder As String, Optional Suffix As String = "*", Optional Log As EBL.Logger.Log = Nothing) As Integer
    2. Dim Result As Integer = 0
    3. Try
    4. 'Anzahl der Dateien in einer Verzeichnisebene
    5. Result += System.IO.Directory.GetFiles(pFolder, "*." & Suffix, IO.SearchOption.TopDirectoryOnly).Count
    6. 'Für jeden Unterordner FOLDER des Ordners pFolder
    7. For Each FOLDER As String In System.IO.Directory.GetDirectories(pFolder)
    8. Result += GetFilesCount(FOLDER)
    9. Next
    10. 'Gebe die komplette Liste zurück
    11. Catch ex As Exception
    12. If Not IsNothing(Log) Then
    13. Log.WriteAsError("Fehler in GetFilesCount" & vbCrLf & "pFolder:= " & pFolder & vbCrLf & "Suffix:= " & Suffix & vbCrLf & ex.ToString)
    14. End If
    15. End Try
    16. Return Result
    17. End Function


    Das Problem ist, dass die Anzahl nicht stimmt, weil auch geschützte und versteckte Dateien mit aufgelistet (z.B. Thumbs.db) werden.

    Hat einer eine Idee, wie ich das am einfachsten in Griff bekommen kann?

    Auf den Namen zu prüfen ist ja auch nicht so ganz "sicher".

    Gruß Jan
    @jan99 Mach das über New DirectoryInfo(PATH).GetFiles(...).
    Da bekommst Du FileInfo-Instanzen zurück, und da kannst Du gleich die .Attributes auswerten.
    msdn.microsoft.com/de-de/libra…o.fileinfo(v=vs.110).aspx
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin !

    muss aber nochmal nachhaken.

    Habe mir

    VB.NET-Quellcode

    1. 'Anzahl der Dateien in einer Verzeichnisebene
    2. Dim di As DirectoryInfo = New DirectoryInfo(pFolder)
    3. Debug.Write(pFolder)
    4. For Each fi In di.GetFiles("*." & Suffix, SearchOption.TopDirectoryOnly)
    5. Select Case fi.Attributes
    6. Case FileAttributes.Hidden ' versteckte
    7. ' hier passiert nicht - nur um diese herauszufiltern
    8. Case Else
    9. Result += 1
    10. Debug.Write("--- " & Result.ToString & " " & fi.Name)
    11. End Select
    12. Next


    erstellt. Aber bei der Thumbs.db wird diese immer noch mitgezählt. Schaue ich mir das Attribut an, dann wird folgendes gelistet:

    FileAttributes.Hidden Or FileAttributes.System Or FileAttributes.Archive Or FileAttributes.NotContentIndexed


    Habe dann überlegt, ob es etwas wie fi.Attributes.contain gibt - aber das war falsch.

    Mein Select greift hier nicht!

    Wie kann ich das dennoch erfolgreich abprüfen?

    Gruß Jan

    Da hatte sich noch etwas überschnitten:

    Das Problem ist unlösbar.
    Du kannst nicht Dateien zählen, in einem Ordner, in dem zu kein Zugriffsrecht hast.


    Es ist aber so, dass für die Verzeichnisse für die aktuelle Aufgabe keine Beschränkungen vorliegen.

    Ansonsten könnte man eine Fehlermeldung ausgeben, dass die Anzahl nicht passen wird!

    Gruß Jan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jan99“ ()

    jan99 schrieb:

    Thumbs.db
    kannst Du ja per Namen ausschließen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Attribute kannst du mit der Enum.HasFlag-Methode prüfen.

    VB.NET-Quellcode

    1. 'Anzahl der Dateien in einer Verzeichnisebene
    2. Dim di As IO.DirectoryInfo = New IO.DirectoryInfo(pFolder)
    3. Debug.Write(pFolder)
    4. For Each fi As IO.FileInfo In di.GetFiles("*." & Suffix, IO.SearchOption.TopDirectoryOnly)
    5. If Not fi.Attributes.HasFlag(IO.FileAttributes.Hidden) Then
    6. Result += 1
    7. Debug.Write("--- " & Result.ToString & " " & fi.Name)
    8. End If
    9. Next
    @HenryV Jou.
    @jan99 Du kannst auch Or-Verknüpfungen von Flags abfragen:

    VB.NET-Quellcode

    1. If Not fi.Attributes.HasFlag(IO.FileAttributes.Hidden Or FileAttributes.NotContentIndexed) Then
    2. ' ...
    3. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!