Tote Dateien finden

  • VB.NET

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

    Tote Dateien finden

    Hallo!

    Ich habe einen Button, eine Datagridview und eine Listbox auf meiner Form.

    Also in der Listbox stehen Bsp.-weise:
    Bild1.jpg
    Bild2.jpg
    Bild3.jpg

    und in der DGV steht Bsp.-weise:
    C:/Daten/Bild1.jpg
    C:/Daten/Bild3.jpg

    es befindet sich also in der Listbox eine Datei (Bild2.jpg) die nicht in der DGV steht.

    Also so weit bin ich schon. Aber jetzt kommt der Teil wo ich nicht mehr weiter weis:

    Jetzt sollen in der Listbox alle Einträge außer die die nicht in der DGV stehen gelöscht werden.

    In diesem Beispiel steht nach dem Button klick nur mehr:
    Bild2.jpg

    Hintergrund ist der:

    Ich will Fotos die nicht mehr verwendet werden aufgelistet werden und im Anschluss auch gelöscht werden.

    Ich sags gleich vorweg - ich bin kein Programmierer eher ein Codekopierer. Ich verkaufe auch dieses Programm nicht, nein ich bin Mitglied der Freiwilligen Feuerwehr und dieses Programm soll alle unsere Hydranten im Ort auflisten (ink. Fotos).

    Vielleicht ist jemand so nett und hilft mir (und somit der FF Laakirchen) mit möglichst fertigen Codebeispielen. Ich weis ich verlange viel, aber ohne euch bekomme ich dieses Projekt nicht gestemmt!


    Besten Dank im Vorraus
    ok also ich muss die Bilder in die Listbox in diesem Format einfügen:
    C:/Bild1.jpg

    weil in der DGV stehen sie auch in diesem Format

    OK das hab ich geschafft!
    Beide Listen haben nun das gleiche Fomat:
    Listbox1 = C:/Bild1.jpg
    Datagriedview1 Spalte s: = C:/Bild1.jpg

    Also bei beiden Listen wird der Pfad ausgegeben.
    Wie gehts nun weiter?
    Wenn du ein typ. Dataset hast und dein DGV an deine Tabelle gebunden ist, kannst du wie unten mit LINQ vorgehen...

    VB.NET-Quellcode

    1. Dim listeDGV = From x In DeinDataSet.DeineTabelle Select x.DeineFotoColumn
    2. Dim result = ListeListBox.Except(listeDGV)
    3. If result.Count = 0 Then Return ' keine Elemente in result

    result beinhaltet alle toten Bilddateien...

    VB.NET-Quellcode

    1. Dim listeDGV = From x In Hydrantmanager2DataSet.Table1 Select x.Column18
    2. Dim result = ListBox1.Except(listeDGV)
    3. If result.Count = 0 Then Return ' keine Elemente in result


    VB.NET-Quellcode

    1. ListBox1.Except

    wird blau unterstrichen und es steht folgender Fehler: Except ist kein member von System.Windows.forms.Listbox

    vierkant schrieb:

    ListBox1.Except

    geht nicht, weil ListBox1 ein Control ist!
    Ich meinte es so: Dim result = My.Computer.FileSystem.GetFiles((Path.GetDirectoryName(Application.ExecutablePath) & "\Daten" & Comboort.Text)).Except(ListeDGV)

    ...besser macht man so eine FileListe über DirectoryInfo und gleich die Datasource-Eigenschaft der Listbox bedienen, das ist meine Meinung...
    ok! Danke! Das geht schonmal!

    Und wie gehts jetzt weiter?

    1.) Ich leere die Listbox
    und wie befülle ich sie nun mit den neuen Daten?

    Oder kann ich mit result die Bilder gleich löschen lassen? Wäre das möglich?
    Also das:

    VB.NET-Quellcode

    1. File.Delete(result)

    geht schonmal nicht
    Ja ja hab e eine Sicherung.


    Also so werden die Pfade aller Fotos im Ordner in die listbox eingetragen:

    VB.NET-Quellcode

    1. Try
    2. For Each dateien As String In
    3. My.Computer.FileSystem.GetFiles((Path.GetDirectoryName(Application.ExecutablePath) & "\Daten" & Comboort.Text))
    4. Me.ListBox1.Items.Add(dateien)
    5. Next
    6. Catch
    7. End Try
    8. Try
    9. ListBox1.Items.Remove((Path.GetDirectoryName(Application.ExecutablePath) & "\Daten" & Comboort.Text) & "" & Comboort.Text & ".xml")
    10. Catch ex As Exception
    11. End Try
    12. 'ENDE


    Es befindet sich im Ordner der Fotos auch eine xml Datei - die soll natürlich auch verschohnt werden von daher:

    VB.NET-Quellcode

    1. ListBox1.Items.Remove((Path.GetDirectoryName(Application.ExecutablePath) & "\Daten" & Comboort.Text) & "" & Comboort.Text & ".xml")


    So im Button steht folgender Code:

    VB.NET-Quellcode

    1. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    2. Dim listeDGV = From x In Hydrantmanager2DataSet.Table1 Select x.Column18
    3. Dim result = My.Computer.FileSystem.GetFiles((Path.GetDirectoryName(Application.ExecutablePath) & "\Daten" & Comboort.Text)).Except(listeDGV)
    4. If result.Count = 0 Then Return ' keine Elemente in result
    5. result.ToList.ForEach(Sub(f)
    6. Dim fi = New FileInfo(f)
    7. fi.Delete()
    8. End Sub)
    9. End Sub




    Edit:
    in meinem Ordner befinden sich:
    2 Fotos (davon ist eines Tod
    und die besagte xml Datei

    Hab mal folgenden Code versucht:

    VB.NET-Quellcode

    1. Dim listeDGV = From x In Hydrantmanager2DataSet.Table1 Select x.Column18
    2. Dim result = My.Computer.FileSystem.GetFiles((Path.GetDirectoryName(Application.ExecutablePath) & "\Daten" & Comboort.Text)).Except(listeDGV)
    3. TextBox1.Text = result.Count


    Da steht dann in der Textbox: 3

    und gelöscht werden auch alle 3

    Edit 2:

    Da steht dann in der Textbox: 3

    und gelöscht werden auch alle 3

    sorry falsch so meinte ich
    Da steht dann in der Textbox: 2

    und gelöscht werden alle 3

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

    Beim 1. Teil lasse die Try Catch-Zweige weg, die brauchst du da nicht - schreibe lieber so:

    VB.NET-Quellcode

    1. Dim di As New DirectoryInfo(String.Concat(Application.StartupPath, "\Daten", Comboort.Text))
    2. Dim listB = di.EnumerateFiles("*.jpg") ' gewünschtes Bildformat angeben
    3. ListBox1.DataSource = listB.ToArray
    4. ' hier werden die toten Bilder herausgefiltert (alles in listB, was nicht in der Tabelle ist)
    5. Dim result = listB.Except(From x In Hydrantmanager2DataSet.Table1 Select x.Column18)
    6. If result.Count = 0 Then Return ' keine Elemente in result
    7. ' hier werden die toten Bilder echt gelöscht
    8. result.ToList.ForEach(Sub(f)
    9. Dim fi = New FileInfo(f)
    10. fi.Delete()
    11. End Sub)

    lese den Komentar in Zeile #4, sind wir da einer Meinung?
    Mache einen Haltepunkt in Zeile #6 und schaue dir das Ergebnis der result-Liste einmal an...
    siehe nochmals unten im kleinen Rahmen, da wird nur D herausgefiltert!

    VB.NET-Quellcode

    1. Dim l1 As New List(Of String) From {"A", "B", "D"}
    2. Dim l2 As New List(Of String) From {"A", "B", "C"}
    3. Dim result = l1.Except(l2)

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

    VB.NET-Quellcode

    1. Dim fi = New FileInfo(f)

    Fehler:

    "f" wird blau unterstrichen
    Der Wert vom Typ "System.IO.FileInfo" kann nicht in "String" konvertiert werden.

    Das wir uns nicht in einen Wirbel verwickeln Fasse ich noch einmal zusammen
    im Ordner
    (Path.GetDirectoryName(Application.ExecutablePath) & "\Daten" & Comboort.Text)

    befinden sich ALLE Bilder und eine xml Datei.

    alle im Ordner befindlichen Bilder deren Pfad sich nicht in der DGV befinden müssen gelöscht werden!