Mit DirectoryInfo Verzeichniss Attribute auslesen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Mit DirectoryInfo Verzeichniss Attribute auslesen

    Hallo liebe Gemeinde

    ich möchte gerne Verzeichnisse Rekursiv durchsuchen und dabei die Windows System Ordner aussparen.
    Mein bisheriger Versuch sieht folgendermaßen aus: [Quick and Dirty nur zum Testen]

    VB.NET-Quellcode

    1. Public Function F_Test(str_In As String) As Integer
    2. Dim obj_Test As DirectoryInfo
    3. obj_Test = My.Computer.FileSystem.GetDirectoryInfo(str_In)
    4. Dim attributeReader As System.IO.FileAttributes
    5. attributeReader = obj_Test.Attributes
    6. Return attributeReader
    7. End Function

    Doch wenn ich die Funktion mit z.B.
    1. "C:\"
    2. "C:\$Recycle.Bin\"
    3. "C:\System Volume Information"
    aufrufe lautet das Ergebens immer 22! Was besonderes für Punkt 1. "C:\" doof ist, ich möchte ja nur den Papierkorb und alle anderen Systemordner umgehen.

    Meine Idee dazu habe ich von MSDN
    Zitat: -Gewusst wie: Bestimmen der Attribute eines Verzeichnisses in Visual Basic-

    VB.NET-Quellcode

    1. Dim checkFile As System.IO.DirectoryInfo
    2. checkFile = My.Computer.FileSystem.GetDirectoryInfo("C:\TestDir")
    3. Dim attributeReader As System.IO.FileAttributes
    4. attributeReader = checkFile.Attributes
    5. If (attributeReader And System.IO.FileAttributes.Hidden) > 0 Then
    6. MsgBox("Directory is hidden")
    7. End If

    Wobei ich auch das Beispiel nicht so ganz verstehe. Wieso checken die noch mal gegen "System.IO.FileAttributes.Hidden" ??
    Hat jemand eine Idee oder einen Vorschlag wie ich das am besten mache?
    Eine Lösung wäre es einfach bei jedem Verzeichnis Aufruf den String gegen Punkt 2+3 zu testen, was ich aber als eine sehr unschöne Lösung empfinde.
    Es muss doch eine Möglichkeit geben, Windows zu entlocken was für eine Art von Verzeichnis man da gerade in der Hand hat, sei es nun über eine Liste vom System selber, gegen das man vergleichen kann oder über die Attribute der Verzeichnisse.
    Das ganze soll unter Windows 7 64Bit laufen.

    Und eine Ergänzungsfrage dazu. Ich habe auch mal zum Versuch, meine ganze Festplatte "C:\" und "D:\" durchlaufen lassen und mir ne Liste ausgeben lassen was für Attribute ich finde. Da waren neben der 16(Normales Verzeichnis), auch noch eine Reihe Werte, die nicht in der MSDN-Tabelle stehen, wie 8025 und 18. Weiß jemand um was es sich dabei handelt oder auf welcher Grundlage - Liste ich die Werte vergleichen kann?

    Schon mal herzlichen Dank fürs Nachdenken
    LG Magier
    @Magier:: Hol Dir zunächst mal die Liste der betreffenden Verzeichnisse:

    VB.NET-Quellcode

    1. Dim di() = New IO.DirectoryInfo("c:").GetDirectories()
    Die kannst Du dann mit For Each durchgehen und dabei die "Wverbotenen" auslassen.

    Magier schrieb:

    wie 8025 und 18
    Das sind Flags.

    Bei 8025 sind Bits dabei, die er nicht kennt, die kann er nicht selbst zerlegen. Wenn Du ihm die unbekannten wegnimmst, bleiben die bekanten übrig und Du kannst gezielt nach den unbekannten suchen bzw. fragen.
    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!
    Hallo RodFromGermany

    RodFromGermany schrieb:

    Hol Dir zunächst mal die Liste der betreffenden Verzeichnisse:
    Danke, wie man sich rekursiv oder auch nicht durch einen Verzeichnisbaum hangelt weiß ich.

    VB.NET-Quellcode

    1. Public Function F_Get_Sub_Folders(str_In As String) As List(Of String)
    2. Dim arr_Re As New List(Of String)
    3. If F_Test(str_In) <> 22 Then
    4. Try
    5. arr_Re.AddRange(Directory.GetDirectories(str_In))
    6. Catch ex As Exception
    7. End Try
    8. End If
    9. Return arr_Re
    10. End Function
    11. 'Funktion F_Test() siehe Post 1

    Wie man sieht arbeite ich schon mit einer Try....Catch Lösung. Was aber nicht zuverlässig funktioniert, da der Code so auch in ...$Recycle.Bin geht und das möchte ich ja vermeiden. Daher die Idee, die Attribute auszulesen.

    Es muss doch eine schon bewährte Methode gehen, dem Dateisystem zu entlocken das der betreffende Ordner ein System Ordner ist. Im Explorer sehe ich immer nur das
    1. "C:\$Recycle.Bin\"
    2. "C:\System Volume Information"
    versteckte Ordner sind aber daran mag ich das nicht fest machen.....
    Teste jetzt mal verschieden Kombinationen mit der DirectCaste Methode. Aber schon mal Danke!

    Magier schrieb:

    8025 und 18
    18=16+2=Directory+Hidden
    Wurde oben ja schon mit DirectCast aufgelöst.

    8025 scheint etwas sehr merkwürdiges zu sein:
    8025=4096+2048+1024+512+256+64+16+8+1=Offline+Compressed+ReparsedPoint+SparseFile+Temporary+Device(Unused)+Directory+?????+ReadOnly
    Zu welchem Verzeichnisnamen gehört denn diese Bitmaske?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Also hier mal meine gesammelten Werte.
    • 16 -> C:\AMD; C:\Program Files\ATI
    • 17 -> C:\Program Files; C:\Program Files (x86); C:\Users
    • 18 -> C:\Program Files\Uninstall Information; C:\Users\Magier\AppData\Local\Microsoft\Media Player\Grafikcache
    • 19 -> C:\Users\Default; C:\Users\Public\Desktop
    • 20 -> C:\ProgramData\Microsoft\Crypto\Keys; C:\Windows\System32\LogFiles\AIT; C:\Users\Default\AppData\Local\Microsoft\Windows\History
    • 21 -> C:\Windows\assembly; C:\Windows\Fonts; C:\Windows\Media
    • 22 -> C:\; D:\; $Recycle.Bin; C:\Config.Msi; C:\Windows\Installer
    • 48 -> C:\Program Files (x86)\MirandaIM\smileys; C:\Users\Magier\Desktop\MPEG\Filme
    • 2064 -> C:\ProgramData\Microsoft\Windows\WER\ReportArchive; C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SetupCache
    • 2070 -> C:\Program Files (x86)\Work\{0F9F096B-9EF0-43A2-91C8-4613835312F7}
    • 8208 -> C:\$Recycle.Bin\S-1-5-18\$R27UGYG; C:\ProgramData\Adobe
    • 8209 -> C:\Users\Magier\AppData\Local\Microsoft Games\Solitaire; C:\Windows\ServiceProfiles\NetworkService\AppData\Roaming\Microsoft\Windows\SendTo
    • 8210 -> C:\ProgramData;C:\ProgramData; C:\Windows\ServiceProfiles\LocalService\AppData
    • 8212 -> C:\ProgramData\Microsoft; C:\Users\MSSQLFDLauncher\AppData\Roaming\Microsoft
    • 8214 -> C:\ProgramData\Microsoft\Windows\DRM\Cache; C:\Recovery;C:\Users\All Users\Microsoft\Windows\DRM\Cache
    • 9238 -> C:\Documents and Settings; C:\Programme; C:\Users\All Users
    • 10256 -> C:\Users\Magier\AppData\Local\Microsoft\Windows\WER\ReportQueue

    petaod schrieb:

    8025 scheint etwas sehr merkwürdiges zu sein:
    Habe die 8025 nicht mehr finden können, habe den Code Teil mit dem ich zu der Zeit gearbeitet habe, leider schon gelöscht oder bearbeitet. Wie ich an diese Werte gekommen bin poste ich weiter unten aber für die 8025 ist es wohl wahrscheinlicher das ich mich verschrieben habe. Sorry dafür!!!!!

    Jetzt habe ich die komischen Werte die nicht in der MSDN Liste stehen aber endlich verstanden. Das ist das Bitarray, für Bits wie Readonly und Hidden....Grimpf das ich das auch nicht früher gesehen habe.

    Finde es zwar seltsam wieso es keine einfachere Lösung als Bitmasken auseinander zu bauen aber ich probiere es mal.

    Hier der "wichtige" Teil des Code's......

    VB.NET-Quellcode

    1. Private Sub S_Folder(str_In As String)
    2. F_Data.Add_Folder(str_In) 'Funktion in der ich ein Array zum sammeln gebaut habe, ruft im Verlauf F_Test() auf.......
    3. Try
    4. For Each str_run As String In Directory.GetDirectories(str_In)
    5. S_Folder(str_run)
    6. Next
    7. Catch ex As Exception
    8. End Try
    9. End Sub




    VB.NET-Quellcode

    1. Private Function F_Test(str_In As String) As Integer
    2. Dim obj_Test As DirectoryInfo
    3. obj_Test = My.Computer.FileSystem.GetDirectoryInfo(str_In)
    4. Dim attributeReader As System.IO.FileAttributes
    5. attributeReader = obj_Test.Attributes
    6. Return attributeReader
    7. End Function

    Magier schrieb:

    Was besonderes für Punkt 1. "C:\" doof ist, ich möchte ja nur den Papierkorb und alle anderen Systemordner umgehen.
    Hmm - was sind "SystemOrdner"?
    Deren gibt es verschiedene, meist sind sie versteckt - FileAttribute.Hidden.
    Aber es gibt natürlich auch nicht-System-Ordner, die hidden sind.

    VB.NET-Quellcode

    1. dim di As new DirectoryInfo(path)
    2. if di.Attribute.HasFlag(FileAttribute.Hidden) Then '...
    Ich find das eiglich sehr einfach.

    2 Empfehlungen: vergiss Directory.GetDirectories() - das liefert dir nur dumme Strings.
    Nimm DirectoryInfo.GetDirectories() - das liefert dir DirectoryInfos
    die Function F_Test kann dann weg, denn die FileAttributes kannst du dann ja direkt vom DirectoryInfo abrufen.

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

    ErfinderDesRades schrieb:

    VB.NET-Quellcode

    1. dim di As new DirectoryInfo(path)
    2. if di.Attribute.HasFlag(FileAttribute.Hidden) Then '...
    Also ich habe das versucht umzusetzen, aber da meldet VS 'HasFlag' ist kein Member von 'System.IO.FileAttributes' und ich finde im Objectbrowser auch nichts!
    oder meinst du damit eine extra Extension?
    Momentan frage ich die Attributes so ab...

    VB.NET-Quellcode

    1. If (di.Attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then '...
    @EDR: Jou
    @VB1963:: HasFlag() gibt es erst ab FW 4.0.

    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!