Konsolenanwendung -> Dateien nach Namen und Inhalt durchsuchen und ausgeben

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

    Konsolenanwendung -> Dateien nach Namen und Inhalt durchsuchen und ausgeben

    Hallo,

    ich möchte eine kleine Konsolenawendung schreiben, die mir folgendes bietet:

    - Eingabe des Dateinamens z.B. "Test.txt"
    - Eingabe eines Suchbegriffs, der in der Datei gesucht werden soll
    - Ausgabe der gefundenen Dateien mit Pfad
    - Es soll im Idealfall das ganze Laufwerk durchsucht werden (z.B. C)


    Folgenden Code habe ich momentan:

    VB.NET-Quellcode

    1. Module Module1
    2. Dim dateiname As String
    3. Dim inhalt As String
    4. Private Property foundfile As Object
    5. Sub Main()
    6. Console.WriteLine("Bitte Dateinamen eingeben: ")
    7. dateiname = Console.ReadLine()
    8. Console.WriteLine("Bitte zu suchenden Inhalt eingeben: ")
    9. inhalt = Console.ReadLine()
    10. For Each foundFile As String In My.Computer.FileSystem.GetFiles(
    11. My.Computer.FileSystem.CurrentDirectory = "C:\",
    12. Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, dateiname)
    13. Next
    14. Dim sr1 As New System.IO.FileStream(foundfile, IO.FileMode.Open, IO.FileAccess.Read)
    15. Dim reader1 As New System.IO.StreamReader(sr1)
    16. Do Until reader1.EndOfStream
    17. Dim line As String = reader1.ReadLine
    18. If line.Contains(inhalt) = True Then
    19. Console.WriteLine(foundfile)
    20. End If
    21. Loop
    22. End Sub
    23. End Module


    Leider bekomme ich eine System.IO.DirectoryNotFoundException ausgeworfen:
    "{"Ein Teil des Pfades "c:\users\XY\documents\visual studio 2013\Projects\ConsoleApplication2\ConsoleApplication2\bin\Debug\False" konnte nicht gefunden werden."}"

    Folgender Part scheint falsch zu sein:

    VB.NET-Quellcode

    1. For Each foundFile As String In My.Computer.FileSystem.GetFiles(
    2. My.Computer.FileSystem.CurrentDirectory = "C:\",
    3. Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, dateiname)



    Ich habe schon Google und mein Gehirn bemüht, aber ich komme einfach nicht drauf.


    Hat jemand eine Idee?
    Hallo,
    Der Pfad c:\users\XY\documents\visual studio 2013\Projects\ConsoleApplication2\ConsoleApplication2\bin\Debug\False scheint nicht zu existieren.

    Versuche es mal so

    VB.NET-Quellcode

    1. For Each foundFile As String In My.Computer.FileSystem.GetFiles("C:\",Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories,dateiname)


    und das gehört in die Schleife nehme ich an, etwa so

    VB.NET-Quellcode

    1. For Each foundFile As String In My.Computer.FileSystem.GetFiles("C:\",Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, dateiname)
    2. Dim sr1 As New System.IO.FileStream(foundfile, IO.FileMode.Open, IO.FileAccess.Read)
    3. Dim reader1 As New System.IO.StreamReader(sr1)
    4. Do Until reader1.EndOfStream
    5. Dim line As String = reader1.ReadLine
    6. If line.Contains(inhalt) = True Then
    7. Console.WriteLine(foundfile)
    8. End If
    9. Loop
    10. Next

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Andy16823“ ()

    Hab mal selbst versucht, und folgendes Ergebnis (Ist mit nem Converter nach VB kopiert):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Namespace ConsoleApplication
    3. Class Program
    4. Private Shared Sub Main(args As String())
    5. Console.WriteLine("Enter filename:")
    6. Dim filename As String = Console.ReadLine()
    7. Console.WriteLine("Enter keyword:")
    8. Dim keyword As String = Console.ReadLine()
    9. For Each fi As FileInfo In New DirectoryInfo("C:\"").GetFiles(filename, SearchOption.AllDirectories)
    10. Try
    11. Dim sr As New StreamReader(fi.FullName)
    12. Dim txt As String = sr.ReadToEnd()
    13. If txt.Contains(keyword) Then
    14. Console.WriteLine(fi.FullName)
    15. End If
    16. Catch ex As Exception
    17. Console.WriteLine("Houston we have a problem @" & fi.FullName & ": " & ex.Message)
    18. End Try
    19. Next
    20. Console.WriteLine("Ready")
    21. Console.ReadLine()
    22. End Sub
    23. End Class
    24. End Namespace


    Und folgendes: Durchlesen, verstehen und fragen. NIcht mehr, nicht weniger.
    Btw: In Zeile 10 ist ein doppel ", da sonst der ganze Code in Rot formatiert würde, der gehört natürlich weg

    EDIT: Auf Hinweis von fichz, müssten Zeile 11-15 in einen Try-Catch Block gelegt werden.
    EDIT2: Damit SpaceyX auch zufrieden ist, packe ich den TryCatch auch gleich rein anstatt ihn zu vermerken.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ThePlexian“ ()

    Zu beachten ist auch noch, dass du innerhalb der Schleife einen Try-Catch Block legen solltest wo die SecurityException abgefangen wird welche auftritt, wenn du auf bestimmte Ordner keine Rechte hast.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    fichz schrieb:

    Try-Catch Block legen solltest wo die SecurityException abgefangen wird

    Genau, des Weiteren:
    1. Dateien / Ordner nicht als Strings behandeln.
    2. Nehm den hässlichen Microsoft.VisualBasic - Namespace raus!

    VB.NET-Quellcode

    1. My.Computer.FileSystem.GetFiles("C:\",Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, dateiname)

    VB.NET-Quellcode

    1. My.Computer.FileSystem.GetFiles("C:\", FileIO.SearchOption.SearchAllSubDirectories, dateiname)

    @OMA

    Hier handelt es sich nicht um den VB-Namespace, sondern um den My-Namespace und dieser ist nicht zu entfernen. Bevor Du jemandem schlaue Ratschläge gibst, was er denn entfernen soll, nimm Dich mal an der eigenen Nase.

    Ergebnisse bei For Schleife merken und ausgeben
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Du nutzt in Deinem Codebeispiel (siehe Link im Post oben) selbst den VB-Namespace:

    VB.NET-Quellcode

    1. vbNewLine


    Die Funktion des TE´s lässt sich nicht anders nutzen. Ein guter Vorschlag wäre gewesen, dass er die Funktionen aus dem System.IO-Namespace verwenden soll.

    BTW: Es gibt keinen Namespace File.IO, wie von Dir genannt.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @OMA
    Lesen lernen!

    OMA schrieb:

    My.Computer.FileSystem.GetFiles("C:\",Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, dateiname)

    Die Methode ist aus My-Namespace, trotzdem natürlich falsch. Nur kann man es nicht entfernen.

    Nur die SearchOption sind vom VisualBasic-Namespace.

    @SpaceyX sagte nirgendwo, dass man System.IO nicht verwenden soll.
    Wieso nicht immer den selben Namespace nutzen?

    VB.NET-Quellcode

    1. Dim Folder As New DirectoryInfo("C:\")
    2. Dim Files As FileInfo() = Folder.GetFiles()
    3. Dim File As FileInfo
    4. ListBox1.Items.Clear()
    5. For Each File In Files
    6. ListBox1.Items.Add(File.Name)
    7. Next

    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Ein Beispiel, welches so komplett gut funktioniert, dass es sich sofort mit einer Exception verabschiedet. :thumbup:
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Wenn Du es mal selber probierst, wirst Du evtl. feststellen, dass Du, strickt bezogen auf Dein Beispiel, keinen rechten Ansatz finden wirst, wo Du den Try-Catch-Block sinnvoll setzen kannst. Die Exception wird schon bei dieser Zeile geworfen.

    VB.NET-Quellcode

    1. For Each fi As FileInfo In New System.IO.DirectoryInfo("C:\"").GetFiles(filename, SearchOption.AllDirectories)


    Also bevor Du überhaupt etwas hast, wo Du sinnvoll Try-Catch nutzen kannst. Setzt Du aber diese Zeile in den Block, so bekommst Du nicht mal die Directories, auf die Du eigentlich Zugriff hast.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Oh okay, das wusste ich nichtmal, dann nehme ich meine Besserwisserei zurück ^^ Ich hatte bei mir den Pfad des Desktops drin, und beim posten hab ich gesehen, dass der TE die ganze Partition prüfen will und hab das einfach gekürzt. D.h. man muss manuell sich den IEnumerable verschaffen oder langt es einmal ein neues Object mit .GetFiles zu befüllen (innerhalb eines TryCatches) ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Würd ich etwa so machen. Jetzt auch nur kurz zusammengeschustert.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _allowedDirectories As New List(Of DirectoryInfo)
    3. Private _deniedDirectories As New List(Of DirectoryInfo)
    4. Private Sub SearchDirectories(dir As DirectoryInfo)
    5. For Each dI As DirectoryInfo In dir.GetDirectories("*.*", SearchOption.TopDirectoryOnly)
    6. Try
    7. SearchDirectories(dI)
    8. _allowedDirectories.Add(dI)
    9. Catch ex As UnauthorizedAccessException
    10. _deniedDirectories.Add(dI)
    11. End Try
    12. Next
    13. End Sub
    14. Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
    15. SearchDirectories(New DirectoryInfo("c:\"))
    16. ListBox1.DataSource = _allowedDirectories
    17. ListBox2.DataSource = _deniedDirectories
    18. Me.Text = String.Concat("Total Dirs: ", _allowedDirectories.Count + _deniedDirectories.Count, " Allowed Dirs: ",
    19. _allowedDirectories.Count, " Denied Dirs: ", _deniedDirectories.Count)
    20. End Sub
    21. End Class


    Evtl. noch asynchron ausführen, da es ziemlich dauern kann.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Polar schrieb:

    ich möchte eine kleine Konsolenawendung schreiben, die mir folgendes bietet:
    Schmeiß die Konsole weg, mach da eine EinForm-Anwendung draus.
    Da hast Du praktische Controls, in denen Du Pfade und Optionen vorgeben kannst. Wenn Du Dich verswchrieben hast, korrigierst Du den Wert (bei einer Console musst Du neu starten).
    Drück auf den Startbutton und los.
    Dann änderst Du ein einziges Zeichen und startest die nächste Suche.
    Bei solch einem Problem ist kein Platz für eine Console :!:
    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!
    So, nochmals vielen Dank für die ganzen Beiträge :)

    Ich nehme nun, wie vorgeschlagen, eine kleine Windows-Forms Anwendung und habe bereits mehrere Beispiele hier aus dem Thread getestet.

    Es scheint zu funktionieren, aber ich bekomme jedes mal, wenn ich eine Suche ausführen möchte, folgenden Fehler:
    "Eine Ausnahme (erste Chance) des Typs "System.UnauthorizedAccessException" ist in mscorlib.dll aufgetreten."

    Zwar ist ein Try-Catch drin, aber das bringt mir natürlich recht wenig, wenn ich auf die gesuchte Datei nicht zugreifen kann.
    Das Problem habe ich bereits gegoogled, aber noch zu keinem richtigen Ergebnis gekommen.