Hilfe bei Suchfunktion ( .Net2012 )

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    Hilfe bei Suchfunktion ( .Net2012 )

    Ich bin mit meinem kleinem Projekt ( Laufwerke nach bestimmten Dateitypen durchsuchen und zippen ) nun schon etwas weiter.
    Nachdem nun einige Hürden genommen sind habe ich eine Suchfunktion eingebaut.

    Fragen:
    In einigen Teilen kann ich Variabeln nur mit Labels übergeben in anderen Teilen geht es direkt mit der Variable.
    Beispiel die Variable " DriveLetter "

    Beim ersten Aufruf kann ich Laufwerk und Dateityp auswählen und die Suche starten.
    Daten werden auch aufgelistet. Siehe Bild

    Beim 2ten klick auf den Suchbutten passieren seltsame Dinge je nachdem auf welchem Laufwerk ich suche; bis hin zum Abbruch bzgl "Keine Rechte "

    Ich hoffe wieder auf nette Hilfe. Bin ja noch am lernen ;)
    Danke schonmals.

    PS: Einiges habe ich schon an Fehlern beseitigen können.

    Hier der Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class mainWin
    3. Private Property Path As Object
    4. Private dtype As String
    5. Private ReadOnly DriveInfos As New List(Of DriveInfo)
    6. Private Sub mainWin_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
    7. For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
    8. If drive.DriveType = IO.DriveType.CDRom Then Continue For
    9. Dim NeueDriveInfoInstanz As New DriveInfo
    10. NeueDriveInfoInstanz.Name = drive.VolumeLabel
    11. NeueDriveInfoInstanz.DriveLetter = drive.Name
    12. DriveInfos.Add(NeueDriveInfoInstanz)
    13. Next
    14. DriveInfoBindingSource.DataSource = DriveInfos
    15. SetDriveViaDriveLetter("C:\")
    16. '2te Combobox füllen
    17. Dim dateityp As New List(Of String)
    18. cmb_datentypen.DataSource = "*.doc *.dat *.rtf".Split
    19. End Sub
    20. Private Sub SetDriveViaDriveLetter(DriveLetter As String)
    21. For i = 0 To DriveInfoBindingSource.Count - 1
    22. If DirectCast(DriveInfoBindingSource(i), DriveInfo).DriveLetter = DriveLetter Then DriveInfoBindingSource.Position = i : Return
    23. Next
    24. MessageBox.Show("Das Laufwerk " & DriveLetter & " konnte nicht gefunden werden.")
    25. End Sub
    26. 'Suche beginnen
    27. Public Sub cmd_datentypen_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmb_datentypen.SelectedIndexChanged
    28. dtype = cmb_datentypen.SelectedItem.ToString
    29. lb_type.Text = dtype
    30. End Sub
    31. Private Sub bt_suche_Click(sender As Object, e As EventArgs) Handles bt_suche.Click
    32. lstFiles.Items.Clear()
    33. Cursor.Current = Cursors.WaitCursor
    34. Dim suchDir As IO.DirectoryInfo
    35. suchDir = New IO.DirectoryInfo(lb_HDDs.Text) ' Hier das Label geht nicht mit der Variable DriveLetter
    36. For Each subdir In suchDir.GetDirectories()
    37. lb_HDDs.Text = subdir.FullName.ToString
    38. Try
    39. For Each sFile As String In My.Computer.FileSystem.GetFiles(lb_HDDs.Text, FileIO.SearchOption.SearchAllSubDirectories, dtype)
    40. lstFiles.Items.Add(sFile)
    41. Next
    42. Catch ua_ex As UnauthorizedAccessException
    43. Catch ex As Exception
    44. End Try
    45. Next
    46. Cursor.Current = Cursors.Default
    47. End Sub
    48. 'Suche ende
    49. Private Sub bt_ende_Click(sender As Object, e As EventArgs) Handles bt_ende.Click
    50. Me.Close()
    51. End Sub
    52. End Class
    53. Public Class DriveInfo
    54. Property DriveLetter As String
    55. Property Name As String
    56. ReadOnly Property FullName As String
    57. Get
    58. Return DriveLetter
    59. End Get
    60. End Property
    61. ReadOnly Property SndName As String
    62. Get
    63. Return DriveLetter & " [ " & Name & " ]"
    64. End Get
    65. End Property
    66. End Class
    Bilder
    • Unbenannt.jpg

      84,45 kB, 637×290, 77 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Zu den "seltsamen Dingen" kann man glaub nix sagen .

    Aber ich kann meine Verbesserungs vorschläge wiederholen - die sind ja zum teil verschütt gegangen bei einer Entwicklungs-Umorientierung, zum Teil haste dir da wohl neue Fragwürdigkeiten ergoogelt.
    1. zeile#3 - wird nicht verwendet, kann weg
    2. zeile#4: wird nur in 1 Methode verwendet. Wäre also besser lokal in dieser Methode deklariert, anstatt klassenweit
    3. #45: Versuchen wir wieder, ins Knie zu schiessen? Dass die UnauthorizedAccessException gefangen werden soll ist verständlich (aber fragwürdig implementiert), aber zusätzlich einfach jede Exception wegCatchen erzeugt ein undebug-bares Verhalten - wenn da mal ein Fehler auftritt (ein anderer als UnauthorizedAccess)
    4. am unerfreulichsten ist #41: Tipp: Vergiss den My-Namespace. Das sind lauter ShortCuts auf iwelches Zeug, v.a. auf Vb6-Kram. ShortCut bedeutet, du weisst nicht, wo es herkommt und was es eiglich ist, und das ist auch nicht rauszukriegen (bzw. nur sehr tricky)
      Statt so Querschläger aus dem My-Nirvana nimm doch einfach die Sachen, die du vor der Nase hast:

      VB.NET-Quellcode

      1. Cursor.Current = Cursors.WaitCursor
      2. Dim suchDir As New IO.DirectoryInfo(lb_HDDs.Text) ' Hier das Label geht nicht mit der Variable DriveLetter
      3. For Each subdir In suchDir.GetDirectories()
      4. lb_HDDs.Text = subdir.FullName.ToString
      5. Try
      6. For Each fi As IO.FileInfo In subDir.GetFiles(lb_type.Text, IO.SearchOption.AllDirectories)
      7. lstFiles.Items.Add(fi.Fullname)
      8. Next
      9. Catch ua_ex As UnauthorizedAccessException
      10. End Try
      11. Next
      12. Cursor.Current = Cursors.Default


    Du solltest dir wirklich das von mir nu mehrfach gegebene Video-Tut mal reintun, da rede ich auch ein bischen über FileInfo, Directoryinfo etc., und zeige, wie man diese Sachen anguckt, dass man lernt, was die können.
    Googel ist nicht deine Mami!

    Es ist immer noch nicht wirklich brauchbar, aber solange "seltsamkeit" das einzige Problem ist, mache ich nur Vorschläge, um das bislang Erreichte besser zu erreichen.
    (Ohne die Funktionalität umzumodeln, wie ich es haben wollen würde)

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

    ErfinderDesRades schrieb:

    Aber ich kann meine Verbesserungs vorschläge wiederholen - die sind ja zum teil verschütt gegangen bei einer Entwicklungs-Umorientierung, zum Teil haste dir da wohl neue Fragwürdigkeiten angelesen aus dem Internet.


    Fragwürdigkeiten? ... Naja was von dem ganzen was ich so finde Fragwürdig ist erfahre ich erst wenn ich gelesen und probiert habe und dann hier nachfrage. ;)

    Dei Zeilen die Du bemängelst hast was weg kann oder in die entsprechende Sub, habe ich gemacht. Das funktionierte auch.
    Dann habe ich deine Änderungen am Suchcode vorgenommen.
    Es wird zwar gesucht aber NICHTS mehr in der Listbox angezeigt.

    VB.NET-Quellcode

    1. ​lb_HDDs.Text = subdir.FullName.ToString

    Hier wird nach dem Suchen ein meist xBelibiges Verzeichnis angezeigt. Das war aber von Begin an so!
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Es wird zwar gesucht aber NICHTS mehr in der Listbox angezeigt.
    Dann wird der SuchPattern lb_HDDs.Text wohl nicht passen, und er findet nix.
    Probierma so:

    VB.NET-Quellcode

    1. For Each fi As IO.FileInfo In subDir.GetFiles(dtype, IO.SearchOption.AllDirectories)




    Amelie schrieb:

    Hier wird nach dem Suchen ein meist xBelibiges Verzeichnis angezeigt. Das war aber von Begin an so!
    Jo - während der Suche ist das Form eingefroren.
    Also der Thread ist vollkommen mit der Suche in Anspruch genommen, und kann die Anzeige nicht aktualisieren. Der Text des Labels wird folglich geändert, aber nicht sichtbar.
    Ist die Suche durchgelaufen wird dann das sichtbar, was zuletzt reingeschrieben wurde.
    Derlei wäre mit Nebenläufigkeit zu lösen, ist aber ein eigenes recht aufwändiges Thema.

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

    ErfinderDesRades schrieb:

    For Each fi As IO.FileInfo In subDir.GetFiles(lb_type.Text, IO.SearchOption.AllDirectories)

    Da haste ein Tipfehler "fi muss sFile" aber das nur am Rande.

    VB.NET-Quellcode

    1. For Each sFile As IO.FileInfo In subdir.GetFiles(lb_type.Text, IO.SearchOption.AllDirectories)
    2. lstFiles.Items.Add(sFile)
    3. Next​

    Zeigt jetzt zwar wieder die Dateien an aber nicht mehr die Verzeichnisse / Unterverzeichnisse ...
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    nö, kein Tippfehler.
    bzw zwischenzeitlich hatte ich den editiert - Kopiers dir die akt. Version nochmal richtig ein.

    Aber Tippfehler treten natürlich trotzdem leicht auf - weil Code aussm Post iwo hinkopieren und umbasteln ist ja nicht lauffähig, und somit nicht testbar.

    Es muss fi heissen, nicht sFile. Denn es ist ein FileInfo, kein String.
    Ich lese gerade dein Post: Keine Strings in die File-Listbox!

    Wie muss das denn nun genau sein?
    Was muss ich mit der ListBox einstellen?
    Auf der Micosoftseite steht auch naoch viel über die Verwendung von "My.Comupter...."

    Alles so verwirrend
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Auf der Micosoftseite...
    Ah - Google!!

    Amelie schrieb:

    Alles so verwirrend
    Ich rate ja von unqualifiziertem Herumgegoogle ab - eben um Verwirrung zu verringern.
    Aber wenn du Verwirrung liebst, dann solltest dich auf YouTube fortbilden!
    Da wird wirklich jeder Sch... verzapft, den man sich nur ausdenken kann, und noch mehr.



    Amelie schrieb:

    Ich lese gerade dein Post: Keine Strings in die File-Listbox!

    Wie muss das denn nun genau sein?
    Das steht da eigentlich, wie das genau sein muss.
    Ist mit Databinding.
    Aber glaub du und Vaporized seid noch nicht so weit vorangekommen.
    Oder vielleicht doch - also wer an eine List(Of DriveInfo) bindet, sollte auch an eine List(Of FileInfo) binden können.
    Das habe ich nun hinbekommen aber....

    VB.NET-Quellcode

    1. For Each subdir In suchDir.GetDirectories()
    2. lb_HDDs.Text = subdir.FullName.ToString
    3. Try


    Hat sich erledigt....
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Wie Du einen Kommentar einfügst weißt du doch ganz offensichtlich.....
    Mach halt aus der ganzen Zeile einen Kommentar, oder lösche die Zeile, wo ist denn das Problem?

    Hat keinen Sinn zu Antworten wenn die Fragen nachträglich geändert werden...

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

    Nur so am Rande:
    "subdir.FullName.ToString"
    .ToString ist hier redundant, da subdir.FullName schon ein String ist.