Große Mengen an Dateien Löschen mit Ausschussliste

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

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Toorms.

    Große Mengen an Dateien Löschen mit Ausschussliste

    Hola Señoritas und Senors,

    hoffe ihr seid noch nicht dahingeschmolzen. Ich komme nach einiger Zeit mal wieder nicht weiter; vielleicht auch nur eine Gedankenblockade.

    Mein Vorhaben ist es ca. 100.000 Dateien zu löschen (ja, so ist der Auftrag; wegen meiner aber auch moven) allerdings mit einer 5000 Einträge-Großen Ausschussliste. Die Größe der Ausschussliste habe ich natürlich erst kurz vor knapp erfahren; wie immer. Habt ihr da eine Idee, wie das ganze umgesetzt werden kann? Die normale .net-File.Delete()_Methode bietet ja keine Ausschussliste-Möglichkeit an. Unterordner sollten hier auch berücksichtigt werden. Vielleicht hat da jemand wat im Hinterkopf von euch?

    So habe ich es im kleinen Stil umgesetzt. Aber ich denke nicht, dass man das so auf 100.000 Dateien umsetzen sollte.

    VB.NET-Quellcode

    1. Sub Main()
    2. Try
    3. Dim strDestinationFolder As String = "D:\Debug\"
    4. Dim liExemptFilenames As New List(Of String)()
    5. #Region "Ex File List"
    6. liExemptFilenames.Add(strDestinationFolder & "exceptmetoo.dat")
    7. #End Region
    8. DeleteOldFiles(strDestinationFolder, True, True, liExemptFilenames)
    9. Catch ex As Exception
    10. Logger(ex.ToString, True, False, False)
    11. End Try
    12. End Sub


    VB.NET-Quellcode

    1. Private Sub DeleteOldFiles(objAsDirectoryName As String, blnAbDeleteSubDirectories As Boolean, blnAbDeleteFolders As Boolean, objExemptFileNames As IEnumerable(Of String))
    2. If blnAbDeleteSubDirectories Then
    3. Dim strSubdirectoryName As String
    4. For Each strSubdirectoryName In Directory.GetDirectories(objAsDirectoryName)
    5. DeleteOldFiles _
    6. (strSubdirectoryName,
    7. blnAbDeleteSubDirectories,
    8. blnAbDeleteFolders,
    9. objExemptFileNames)
    10. If blnAbDeleteFolders Then
    11. Directory.Delete(strSubdirectoryName)
    12. End If
    13. Next
    14. End If
    15. Dim strFileName As String
    16. For Each strFileName In Directory.GetFiles(objAsDirectoryName)
    17. If objExemptFileNames.Contains(strFileName) Then
    18. Console.WriteLine("Skipped: " & strFileName)
    19. Logger(strFileName, False, False, True)
    20. Else
    21. File.Delete(strFileName)
    22. Logger(strFileName, False, True, False)
    23. End If
    24. Next
    25. End Sub



    Wie immer; besten Dank!
    Toorms
    Gut, ich bin nicht sonderlich in Dateimanagement vertieft, aber grundsätzlich würde ich es auch so machen. Was spräche dagegen, das Prinzip auf 100000 Dateien anzuwenden? Ggf. nebenläufig machen, sonst zickt ggf. eine Systemprüffunktion rum.
    Alternativ, falls die Ausschlussdateien weder sehr groß noch in Benutzung sind, ginge ggf: Alle Ausschlussdateien in einen Extraorder verschieben, all deren Pfade merken, das komplette Verzeichnis inkl. Unterverzeichnisse killen und dann die Ausschlussdateien wieder zurückverschieben. Nur ein Gedankengang, aber oft nicht möglich wegen Größe oder in Benutzung; gut, in Benutzung würde eh ne Exception beim Löschen auslösen. Aber generell die Exceptions mit nem General-Try-Catch-Block abzufangen ist vielleicht eh nicht so sinnvoll.
    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.
    Joa, da hast du absolut Recht bzgl. des TryCatch-Blocks. Ich machs noch vernünftig.

    VB.NET-Quellcode

    1. Dim liExemptFilenames As New List(Of String)()
    2. #Region "Ex File List"
    3. liExemptFilenames.Add(strDestinationFolder & "ex.dat")
    4. liExemptFilenames.Add(strDestinationFolder & "ex2.dat")
    5. #End Region


    Hast du hier ein Vorschlag, wie ich die Ausschlüsse aus der txt-Liste auslesen kann? Dachte hier an ReadAllLines, habe hier aber noch keinen wirklichen Verwendungseinsatz gefunden. Also, dass ich quasi nicht alle im Code auflisten muss, sondern er sich einfach der Liste bedient, welche ich dann aus der anderen Abteilung bekomme.

    Mein Problem, was ich auch noch habe ist, dass er nur in der ersten Ebene nach Ausschlüssen schaut. Was zur Folge hat, dass der Auschluss im \ erfolgreich ausgeschlossen wieder, während der im "\Folder2\ex.dat" nicht mehr ausgeschlossen wird und mit weglöscht wird.

    Irgendwelche freshen Ansätze?

    Best - Toorms
    Nun, die Liste wird Dir als Textdatei übergeben. Dann würd ich das auch mit ReadAllLines machen. Was funktioniert daran nicht? Achso. Du willst, dass Du die Datei übergibst und der Code dann jedes Mal direkt dort nachsieht, ob eine Datei ausgeschlossen werden soll. Ja, das ginge. Doch obwohl ich keine Messungen durchgeführt habe, würde ich behaupten, dass es performancetechnisch extrem ungünstig wäre, jedes Mal nen Dateizugriff durchzuführen. Wenn Du die Ausschlussdateien per ReadAllLines einliest, sind sie im viel schnelleren RAM.
    Zum anderen Problem: Nutze nicht Strings, sondern DirectoryInfo und FileInfo. Die sind viel flexibler, auch in ihren Vergleichsmöglichkeiten. Denn wenn Du schreibst

    VB.NET-Quellcode

    1. For Each strFileName In Directory.GetFiles(objAsDirectoryName)
    2. If objExemptFileNames.Contains(strFileName) Then

    dann bekommst Du Strings zurück. Und zwar volle Pfade. Wenn die nicht zu Deinen Ausschlusslisteneinträgen passen, dann werden Dateien gelöscht, die erhalten bleiben sollen. FileInfo kann da zwischen Name (nur Dateiname) und FullName (kompletter Pfad) unterscheiden.
    Allerdings stellt sich mir die Frage, wie die Ausschlussdateien in der Dateiliste angegeben sind: Vollpfad oder nur Dateiname? Macht ja nen Unterschied, ob bei

    Quellcode

    1. C:\DirectoryToScan\bla.db
    2. C:\DirectoryToScan\BackupFrom180530\bla.db

    nur eine Datei oder beide ausgeschlossen werden soll(en).
    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.

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

    In der Ausschussliste stehen dann die vollen Dateipfade (allerding im UNC; \\xy\asd\asd\ad.car).

    Es hat auch nicht geklappt, weil ich mit

    VB.NET-Quellcode

    1. Dim strDestinationFolder As String = "D:\Debug\"
    2. Dim liExemptFilenames As New List(Of String)()
    3. #Region "Ex File List"
    4. liExemptFilenames.Add(strDestinationFolder & "ex.dat")
    5. #End Region


    Die Destination Location vom File ja fest vorgebe. Nunja, das ist dann ja eh hinfällig, denn in der Liste, steht der komplette Pfad drin. Wie wäre das dann am besten umzusetzen, dass ich meine einzelnen Ausschlüsse aus der txt in die

    VB.NET-Quellcode

    1. liExemptFilenames.Add(<KOMPLETTER PFAD AUS DER TXT-AUSSCHUSSLISTE>.toString)


    bekomme? For Each? Vorschläge?

    Best und Mahlzeit - Toorms :)
    @Toorms Probier mal diesen Code zum Konvertieren:
    NativeMethods.cs
    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!
    Hi @RodFromGermany

    Danke dir .. schaue ich mir gleich mal an. Convert war schonmal erfolgreich. Verwurste die Funktion gleichmal bzw. rufe sie auf!

    Best - Toorms

    Update#1:

    RodFromGermany schrieb:

    @Toorms Probier mal diesen Code zum Konvertieren:vb-paradise.de/index.php/Attachment/42978/


    Kommt der Code von dir? Der meckert an einigen Stellen noch rum. Aber gut; kann auch am Converter liegen. Mache mir da mal ein C# Proj draus.



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

    Toorms schrieb:

    kann auch am Converter liegen.
    Pack den Code in ein Programm und sieh Dir dies im IlSpy an.
    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!