Jede Datei im Userordner anzeigen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    Jede Datei im Userordner anzeigen

    Hey, ich möchte alle Datein die im Benutzerordner sind (Inklusive Sub-Ordner wie Desktop, Bilder etc.) Könnte mir jemand helfen?

    Mein Versuch/geht nicht):

    Quellcode

    1. My.Computer.FileSystem.GetFiles( For Each foundFile As String In My.Computer.FileSystem.GetFiles(
    2. "C:/User", FileIO.SearchOption.SearchAllSubDirectories)


    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Mike001 schrieb:

    Mein Versuch geht nicht
    Was geht nicht?
    Was passiert?
    Kommt eine Exception, wenn ja, welche?
    Schmeiß zunächst den VisualBasic-Namespace raus.
    Visual Studio - Empfohlene Einstellungen
    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!
    Ich habe das jetzt so gemacht, allerdings kommt wieder ein Fehler:
    Fehler: Ungültiger enumerationswert 3

    VB.NET-Quellcode

    1. For Each foundFile As String In My.Computer.FileSystem.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile, FileIO.SearchOption.SearchAllSubDirectories))
    2. ListBox1.Items.Add(foundFile)
    3. Else
    4. Next
    5. For Each foundFile As String In My.Computer.FileSystem.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments, FileIO.SearchOption.SearchAllSubDirectories))
    6. ListBox1.Items.Add(foundFile)
    7. Else
    8. Next
    9. For Each foundFile As String In My.Computer.FileSystem.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic, FileIO.SearchOption.SearchAllSubDirectories))
    10. ListBox1.Items.Add(foundFile)
    11. Else
    12. Next
    13. For Each foundFile As String In My.Computer.FileSystem.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures, FileIO.SearchOption.SearchAllSubDirectories))
    14. ListBox1.Items.Add(foundFile)
    15. Else
    16. Next
    17. For Each foundFile As String In My.Computer.FileSystem.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos, FileIO.SearchOption.SearchAllSubDirectories))
    18. ListBox1.Items.Add(foundFile)
    19. Else
    20. Next
    21. For Each foundFile As String In My.Computer.FileSystem.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Desktop, FileIO.SearchOption.SearchAllSubDirectories))
    22. ListBox1.Items.Add(foundFile)
    23. Else
    24. Next
    Habe ich gemacht:
    Funktioniert aber trotzdem nicht.
    Fehler: Der Zugriff auf den Pfad "C:\Users\All Users\Anwendungsdaten" wurde verweigert.

    VB.NET-Quellcode

    1. For Each foundFile As String In Directory.GetFiles("C:\Users\", "*.*", SearchOption.AllDirectories)

    VB.NET-Quellcode

    1. Function SearchDirectorys(Path As String) As List(Of String)
    2. Dim ListOfFile As New List(Of String)
    3. 'Speichert die Pfade aller Dateien in dem Verzeichnis Path
    4. For Each File As String In IO.Directory.GetFiles(Path)
    5. ListOfFile.Add(File)
    6. Next
    7. 'Durchsucht alle Ordner in dem Ordner Path
    8. For Each Directory As String In IO.Directory.GetDirectories(Path)
    9. Try
    10. For Each File As String In SearchDirectorys(Directory)
    11. ListOfFile.Add(File)
    12. Next
    13. Catch
    14. Console.WriteLine("Cannot acces " & Directory)
    15. End Try
    16. Next
    17. Return ListOfFile
    18. End Function


    Diese Funktion sollte wenn ich nichts falsch gemacht habe funktionieren :P
    Hoffe das hilft dir
    Oder die Komplettvariante mit allen Sonderverzeichnissen:

    VB.NET-Quellcode

    1. For Each SpecialDirectory In [Enum].GetValues(GetType(Environment.SpecialFolder)).Cast(Of Environment.SpecialFolder)
    2. Dim TargetPath = Environment.GetFolderPath(SpecialDirectory)
    3. If String.IsNullOrEmpty(TargetPath) Then Continue For
    4. Dim AllTargetDirectories = IO.Directory.EnumerateDirectories(TargetPath, "*.*", IO.SearchOption.AllDirectories)
    5. Try
    6. For Each Directory In AllTargetDirectories
    7. For Each File In IO.Directory.EnumerateFiles(Directory)
    8. Try
    9. ListBox1.Items.Add(File)
    10. Catch UAEx As UnauthorizedAccessException
    11. 'Zugriff verweigert; keine auflistbare Datei
    12. End Try
    13. Next
    14. Next
    15. Catch UAEx As UnauthorizedAccessException
    16. 'Zugriff verweigert; keine auflistbares Verzeichnis
    17. End Try
    18. Next

    Sollten nur einzelne Sonderordner erwünscht sein, dann Zeile#1 entsprechend mit einem Array anpassen.
    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.
    Und wenn du alle Unterverzeichnisse haben willst, dann diese Variante:

    Form

    VB.NET-Quellcode

    1. Private Verzeichnis As List(Of Datensatz)
    2. Private Sub GetAllFiles(Path As String)
    3. For Each Directory In IO.Directory.GetDirectories(Path)
    4. Try
    5. GetAllFiles(Directory)
    6. Catch ex As Exception
    7. Continue For
    8. End Try
    9. End If
    10. Next
    11. Dim Filelist As List(Of Datensatz) = Directory.GetFiles(Path).Select(Function(n) New Datensatz With {.Verzeichnis = n}).ToList
    12. If Filelist IsNot Nothing AndAlso Filelist.Count > 0 Then
    13. Verzeichnis.AddRange(Filelist)
    14. End If
    15. End Sub
    16. Private Sub btnLaden_Click(sender As Object, e As EventArgs) Handles btnLaden.Click
    17. Verzeichnis = New List(Of Datensatz)
    18. GetAllFiles("C:\Users\DeinWindowsBenutzer")
    19. dgvFiles.Columns.Clear()
    20. dgvFiles.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Verzeichnis", .DataPropertyName = "Verzeichnis", .HeaderText = "Verzeichnis", .[ReadOnly] = True})
    21. dgvFiles.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Dateiname", .DataPropertyName = "Dateiname", .HeaderText = "Dateiname", .[ReadOnly] = True})
    22. dgvFiles.DataSource = Verzeichnis
    23. End Sub



    Hier noch die zugehörige Klasse, damit du die Liste auch sauber gebunden in dein DatagridView schmeißen kannst:

    Zusatzklasse

    VB.NET-Quellcode

    1. Public Class Datensatz
    2. Public Property Verzeichnis As String
    3. Public ReadOnly Property Dateiname As String
    4. Get
    5. Return Mid(Verzeichnis, Verzeichnis.LastIndexOf("\") + 2, Verzeichnis.Length - Verzeichnis.LastIndexOf("\") - 1)
    6. End Get
    7. End Property
    8. End Class



    EDIT: Hab gerade @VaporiZeds Beitrag getestet. Der durchsucht ebenfalls alle Unterverzeichnisse durch IO.SearchOption.AllDirectories. Da du ja speziell deine User-Dateien durchsuchen willst, wäre sein Code zu bevorzugen.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    @Yanbel Fang an in .NET zu programmieren. ;)
    Fang an mit der Klasse FileInfo im Namespace IO.
    Dort kannst Du Dir alle Einzelbestandteile des Pfades auslesen und weiterverwenden.
    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!
    @Yanbel Nicht Verzeichnis, sondern Verzeichnis & Dateiname & Extension.
    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 Was genau meinst du? Ich weiß doch nicht was er braucht. Reicht doch wenn er den vollständigen Pfad und den Dateinamen bekommt in diesem Beispiel. Dann muss er sich das selbst so hinfummeln wie er es braucht. Die Variable Verzeichnis ist doch schon gefüllt mit allen Infos. Die Variable Dateiname ist nur als zusätzliches Beispiel gedacht, wie er sich hinterher das rausziehen kann was er braucht. Verstehe gerade nicht was du von mir willst.

    Edit: Glaube dich hat einfach nur mein Variablenname verwirrt. Hier nochmal der Code mit etwas deutlicheren Variablennamen:

    Klasse

    VB.NET-Quellcode

    1. Public Class Datensatz
    2. Public Property Datei As String
    3. Public ReadOnly Property Dateipfad As String
    4. Get
    5. Return New IO.FileInfo(Datei).Directory.FullName
    6. End Get
    7. End Property
    8. Public ReadOnly Property Dateiname As String
    9. Get
    10. Return IO.Path.GetFileNameWithoutExtension(Datei)
    11. End Get
    12. End Property
    13. Public ReadOnly Property DateiEndung As String
    14. Get
    15. Return New IO.FileInfo(Datei).Extension
    16. End Get
    17. End Property
    18. End Class


    Form

    VB.NET-Quellcode

    1. Private Verzeichnis As List(Of Datensatz)
    2. Private Sub GetAllFiles(Path As String)
    3. For Each Directory In IO.Directory.GetDirectories(Path)
    4. Try
    5. GetAllFiles(Directory)
    6. Catch ex As Exception
    7. Continue For
    8. End Try
    9. Next
    10. Dim Filelist As List(Of Datensatz) = Directory.GetFiles(Path).Select(Function(n) New Datensatz With {.Datei = n}).ToList
    11. If Filelist IsNot Nothing AndAlso Filelist.Count > 0 Then
    12. Verzeichnis.AddRange(Filelist)
    13. End If
    14. End Sub
    15. Private Sub btnLaden_Click(sender As Object, e As EventArgs) Handles btnLaden.Click
    16. Verzeichnis = New List(Of Datensatz)
    17. GetAllFiles("C:\Users\DeinWindowsUser")
    18. dgvFiles.Columns.Clear()
    19. dgvFiles.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Datei", .DataPropertyName = "Datei", .HeaderText = "Datei", .[ReadOnly] = True})
    20. dgvFiles.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Dateipfad", .DataPropertyName = "Dateipfad", .HeaderText = "Dateipfad", .[ReadOnly] = True})
    21. dgvFiles.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Dateiname", .DataPropertyName = "Dateiname", .HeaderText = "Dateiname", .[ReadOnly] = True})
    22. dgvFiles.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Dateiendung", .DataPropertyName = "Dateiendung", .HeaderText = "Dateiendung", .[ReadOnly] = True})
    23. dgvFiles.DataSource = Verzeichnis
    24. End Sub


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    Yanbel schrieb:

    Glaube dich hat einfach nur mein Variablenname verwirrt.
    Jou, das war es.
    Da muss ich allerdings den @ErfinderDesRades zitieren: Nomen est omen.
    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!