System Volume Information erscheint bei Dateisuche

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von Cheffboss.

    System Volume Information erscheint bei Dateisuche

    Moin! :)
    Ich möchte gerne mit einer Sub in einem Datenträger nach Bildern suchen.
    Leider erscheint immer folgendes:
    „System Volume Information\IndexerVolumeGuid“.
    Ich habe bereits den Datenträger formatiert und einen neuen
    Angeschlossen und auf Windows 7 / XP / 10 getestet.
    Leider erscheint immer dieser Ordner!
    Sobald ich „SearchOption.AllDirectories“ ändere findet er nicht mehr alle Daten.
    Da der Code auch in allen unter Ordner suchen soll.
    Brauche eure Hilfe!
    BIG THX

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. SucheNachBilder("H:")
    3. End Sub
    4. Private Sub SucheNachBilder(ByVal strPfad As String)
    5. Dim str_Endungen As String = ".jpg|.jpeg|.bmp|.gif|.tif|.png|.ico"
    6. Try
    7. For Each file In Directory.GetFiles(strPfad, "*.*", SearchOption.AllDirectories)
    8. Try
    9. If str_Endungen.Contains(Path.GetExtension(file).ToLower) Then
    10. Me.ListBox1.Items.Add(file)
    11. End If
    12. Catch
    13. End Try
    14. Next
    15. Catch
    16. End Try
    17. End Sub





    *Titel angepasst*
    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Cheffboss“ ()

    @Cheffboss Deine Herangehensweise ist suboptimal.
    Zunächst musst Du alle Verzeichnisse auflisten, dann diese testen, ob Du Lese-Rechte hast, und sie dann auslesen.
    Das mit den Lese-Rechten geht einmal direkt über die Abfrage der echte oder über eine UnauthorizedAccessException.
    Mit letzterer sieht ein Beispielcode so aus;
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Module Module1
    3. Sub Main()
    4. Dim ll As New List(Of String)
    5. Dim dis() As DirectoryInfo = New DirectoryInfo("C:\Windows").GetDirectories("*.*", SearchOption.TopDirectoryOnly)
    6. For Each di In dis
    7. Console.WriteLine("Die Suche nach *.txt ergab")
    8. Try
    9. Console.WriteLine("Auslesen: " & di.FullName)
    10. ListFiles(di.FullName, ".txt", ll)
    11. Catch ex As System.UnauthorizedAccessException
    12. Console.WriteLine("kein Zugriff: " & di.FullName)
    13. ll.Add("kein Zugriff: " & di.FullName)
    14. End Try
    15. Next
    16. IO.File.WriteAllLines("c:\Temp\Win.txt", ll.ToArray)
    17. Console.ReadKey()
    18. End Sub
    19. Private Sub ListFiles(ByVal path As String, pattern As String, ll As List(Of String))
    20. Dim sourceDir As New System.IO.DirectoryInfo(path)
    21. For Each fileSystemInfo In sourceDir.GetFileSystemInfos()
    22. If TypeOf fileSystemInfo Is FileInfo Then
    23. Dim fi = DirectCast(fileSystemInfo, FileInfo)
    24. If fi.Extension = pattern Then
    25. ll.Add(fileSystemInfo.FullName)
    26. Console.WriteLine("Datei: " & fileSystemInfo.FullName)
    27. End If
    28. Else
    29. ListFiles(fileSystemInfo.FullName, pattern, ll)
    30. End If
    31. Next
    32. End Sub
    33. End Module
    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!
    @RodFromGermany
    Leider bekomme ich den Code nicht zum laufen.
    Wenn ich nun nach "*.JPG" suche, kommt immer wieder
    H:\System Volume Information.
    Und es werden keine JPG-Dateien angezeigt!
    Was mache ich falsch? ?(



    @ErfinderDesRades
    Es bricht nicht ab, die Suche geht weiter!
    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    Leider bekomme ich den Code nicht zum laufen.
    Nach 443 Posts im Forum ist das keine gute Ausrede, bei mir funktioniert das problemlos.
    Nimm initial ein Verzeichnis, das weniger Dateien enthält und somit schneller abgearbeitet wird.
    Vielleicht machst Du noch dies:

    VB.NET-Quellcode

    1. If fi.Extension.ToLower = pattern Then

    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!
    @RodFromGermany
    Ich habe den Code nun getestet und folgendes festgestellt.
    Wenn ich in "H:" suche ohne unter Ordner wird nix gefunden.
    Aber wenn im Verzeichnis ein neuer Ordner ist, werden die Daten angezeigt.
    Ich hoffe ich konnte das Problem gut beschreiben.
    Im Anhang noch ein kleines Beispielbild.
    :)

    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    Wenn ich in "H:" suche
    Probier mal "H:\"
    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!
    @Cheffboss Was ist denn das für ein Laufwerk?
    Brauchst Du da Admin-Rechte?
    Wenn ich das mit nem USB-Stick mache, kommt eine Zeile mit Kein Zugriff auf System Volume Information, dann macht er munter weiter.
    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!
    @RodFromGermany
    Ich habe das Programm mit Adminrechten gestartet.
    Gleiches Problem! ;(
    Es ist ein UBS-Speicherstick, habe aber auch mehre getestet.
    Und den Stick auch Formatiert.
    Wenn ich nun alle Bilder z.B vom USB-Speicherstick auslesen möchte,
    erscheint immer dies:
    H:\System Volume Information\IndexerVolumeGuid
    Wäre es sinvoll einfach String.Replace zu verwenden?
    Oder würde das im Verlauf der Anwendung probleme geben?
    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    Wäre es sinvoll einfach String.Replace zu verwenden?
    Keine Ahnung, da ich Deinen Effekt nicht reproduzieren kann.
    Poste mal Deinen vollständigen Code.
    ===
    Welches Betriebssystem hast Du? Bei mir läuft W10-64, Update von vorgestern oder so..
    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!

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Dim pfad As String = "H:\"
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Dim dis() As DirectoryInfo = New DirectoryInfo(pfad).GetDirectories("*.*", SearchOption.AllDirectories)
    7. For Each di In dis
    8. Try
    9. Dim str_Endungen(7) As String
    10. str_Endungen(0) = ".jpg" : str_Endungen(1) = "jpeg"
    11. str_Endungen(2) = ".bmp" : str_Endungen(3) = ".gif"
    12. str_Endungen(4) = ".tif" : str_Endungen(6) = ".ico"
    13. str_Endungen(5) = ".png"
    14. ' Nach allen Bilddateien suchen....
    15. For Each endung In str_Endungen
    16. ListFiles(di.FullName, endung)
    17. Next
    18. Catch ex As System.UnauthorizedAccessException
    19. MsgBox("kein Zugriff: " & di.FullName)
    20. End Try
    21. Next
    22. End Sub
    23. Private Sub ListFiles(ByVal path As String, pattern As String)
    24. Dim sourceDir As New System.IO.DirectoryInfo(path)
    25. For Each fileSystemInfo In sourceDir.GetFileSystemInfos()
    26. If TypeOf fileSystemInfo Is FileInfo Then
    27. Dim fi = DirectCast(fileSystemInfo, FileInfo)
    28. If fi.Extension = pattern Then
    29. Me.ListBox1.Items.Add(fileSystemInfo.FullName)
    30. End If
    31. Else
    32. ListFiles(fileSystemInfo.FullName, pattern)
    33. End If
    34. Next
    35. End Sub
    36. End Class

    Ich habe den Code nun etwas geändert.


    Ich habe es mit Windows 10 Pro 64bit getestet.
    Außerdem noch mit Windows 7 & XP.
    Visual Basic.NET 8o
    MS-SQL
    8o
    Mit dem Code bekomm ich allein schon in Zeile#7 ne berechtigte Ex: »System.UnauthorizedAccessException: "Der Zugriff auf den Pfad "E:\System Volume Information" wurde verweigert."« Du selber nicht?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Schade, ich dachte ich wäre bald am Ziel.
    Wenn ich ein Systemlaufwerk scanne schmiert der Code
    in Zeile#7 ab.
    Das bedeutet ich muss den ganzen Code umschreiben.
    Hmm das wird Sicherlich nicht ganz einfach!
    :huh:
    Visual Basic.NET 8o
    MS-SQL
    8o
    Ich würde es mal folgendermaßen versuchen :

    erstelle dir ne Simple Form (oder passe halt den code entsprechend an :P)


    und versuch diesen Code:



    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click
    2. Dim SearchPath As String = txbPfad.Text
    3. Dim Filter As String = txb_Filter.Text
    4. Try
    5. For Each t As String In IO.Directory.EnumerateFiles(SearchPath, "*" & Filter, SearchOption.AllDirectories)
    6. ListBox1.Items.Add(t)
    7. Next
    8. Catch ex As Exception
    9. MessageBox.Show("Mit dem gewählten Verzeichnis treten Fehler auf, bitte Verwende ein anderes Verzeichnis." & NewLine & ex.ToString)
    10. End Try
    11. End Sub
    12. Private Sub btnPfad_Click(sender As Object, e As EventArgs) Handles btnPfad.Click
    13. fbdPfad.ShowDialog()
    14. txbPfad.Text = fbdPfad.SelectedPath
    15. End Sub


    Edit: oh verflixt, sehe gerade das du framework 2.0 verwendest, da wird das Enumeratfiles nicht funktionieren....
    Bilder
    • g.JPG

      32,98 kB, 766×504, 556 mal angesehen
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    @asusdk
    Danke für deine Mühe.

    Leider hat der Code zwei Schwachstellen.
    1. Nicht unter .NET Framework 2.00 läuffahig.
    2. Sobald ein Verzeichnis gelesen wird ohne Berechtigung,
    beendet der Scann.
    Gewünscht wäre das der Scann weiter geht, und dies einfach überspringt.
    Visual Basic.NET 8o
    MS-SQL
    8o
    @ErfinderDesRades
    Dies war der erste Code, beim zweiten war es genau anders.
    Aber dies ist nun egal.

    @an alle
    Ich habe nun einen neuen Code.
    Einen Code den ich gefunden habe, und diesen ich angepasst habe.
    Ich denke dieser Code funktioniert!
    Kann mal jemand drüber schauen ob dieser Code sauber ist?
    Ob ich diesen nun verwenden kann!
    Falls es noch sinnvolle Optimierung gibt, um noch schneller die Aufgabe durchzuführen.
    THX

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Private Function SucheDaten(ByVal searchpath As String, ByVal filter As String, lstBox As ListBox) As Object
    5. Dim fls As New List(Of String)
    6. Try
    7. Dim flds() As String = Directory.GetDirectories(searchpath)
    8. For Each fld As String In flds
    9. fls.AddRange(CType(SucheDaten(IO.Path.Combine(searchpath, fld), filter, lstBox), IEnumerable(Of String)))
    10. Application.DoEvents()
    11. Next
    12. Catch ex As Exception
    13. 'MsgBox(ex.Message)
    14. End Try
    15. For Each flss As String In Directory.GetFiles(searchpath, filter, SearchOption.TopDirectoryOnly)
    16. lstBox.Items.Add(flss)
    17. Next
    18. Return fls
    19. End Function
    20. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    21. Dim str_Endungen(6) As String
    22. str_Endungen(0) = "*.jpg"
    23. str_Endungen(1) = "*.jpeg"
    24. str_Endungen(2) = "*.bmp"
    25. str_Endungen(3) = "*.gif"
    26. str_Endungen(4) = "*.tif"
    27. str_Endungen(5) = "*.png"
    28. str_Endungen(6) = "*.ico"
    29. For Each endung In str_Endungen
    30. SucheDaten("H:\", endung, Me.ListBox1)
    31. Next
    32. End Sub
    33. End Class

    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Cheffboss“ ()

    Cheffboss schrieb:

    Nicht unter .NET Framework 2.00 läuffahig.
    Warum Framework 2.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!
    Iwie kann ich mit dir nicht kommunizieren - guck, diesen Gesprächsverlauf:

    Cheffboss schrieb:

    Leider erscheint immer folgendes:
    „System Volume Information\IndexerVolumeGuid“.... Leider erscheint immer dieser Ordner!
    Sobald ich „SearchOption.AllDirectories“ ändere findet er nicht mehr alle Daten.

    ErfinderDesRades schrieb:

    Achso - ich hab solch mal hier implementiert: Keine Strings in die File-Listbox!

    Cheffboss schrieb:

    @ErfinderDesRades
    Es bricht nicht ab, die Suche geht weiter!

    ErfinderDesRades schrieb:

    Ja, ist denn das nicht das erwünschte Ergebnis?

    Cheffboss schrieb:

    Dies war der erste Code, beim zweiten war es genau anders.
    Aber dies ist nun egal.

    Ok - egal also.