none
Ordner mit sehr vielen Dateien automatisiert löschen RRS feed

  • Frage

  • Hallo,

    ich muss eine C# Applikation, in der Hinsicht erweitern, dass bei Programmstart, Loggingdaten automatisch gelöscht werden, die älter als 6 Tage sind.

    Idee: BackgroundWorker

    Problem, aufgrund der Vielzahl der Dateien hängt dann die gesamte Anwendung.

    Was kann ich tun?

    Auch selbst wenn man in Windows den Explorer öffnet hängt komplett Windows.

    Problem

    Nimmt man die DOS Prompt - Ausführen geht es. Aber das ist halt nicht das Ziel, die Lösung.

    Irgendwie zippen, dann löschen. Würde so was gehen?

    Grüße Sandra

    Mittwoch, 4. März 2015 15:58

Antworten

  • Hallo Sandra,

    wie bereits gesagt, kann man Verzeichnisse nur löschen, wenn keine Dateien mehr enthalten sind. Die Überladung von Delete ändert nichts daran. Auch dort werden zuerst alle Dateien gelöscht und am Ende das Verzeichnis. Funktioniert das aus irgendeinem Grund nicht - wie Datei im Zugriff - gibt es eine Ausnahme.

    Die Laufzeit ergibt sich also auch dann daraus, wie lange das Löschen der Dateien dauert.

    Ehrlich gesagt, weiß ich nicht, wie so man aus einer Mini-Aufgabe so ein Drama machen kann.... Programmiere es und gut ist.

    Gruß Elmar

    • Als Antwort markiert Sandra Maier Dienstag, 10. März 2015 10:59
    Montag, 9. März 2015 14:25
    Beantworter
  • Hallo Sandra,

    jeder darf gute Ratschläge ignorieren, sollte sich aber dann nicht über das Ergebnis wundern...

    Ein Datenträger (insbes. nicht SSD) verarbeitet nur eine relative geringe Anzahl Zugriffe je Sekunde. Wenn viel protokolliert wird oder der Datenträger mit anderen Aufgaben ausgelastet ist, wird das gleichzeitige Löschen die Last nur vergrößern.

    Aus der Erkenntnis resultierte der Ratschlag, es auf eine Zeit geringer Aktivität zu verlegen ... was durch die Aufgabenplanung einfach realisierbar wäre ...

    Gruß Elmar

    • Als Antwort markiert Sandra Maier Freitag, 13. März 2015 11:47
    Dienstag, 10. März 2015 14:53
    Beantworter
  • Hallo Sandra,

    siehe u. a. http://www.techrepublic.com/blog/the-enterprise-cloud/calculate-iops-in-a-storage-array/

    alles weitere gibt es bei solchen "Kunden" nur gegen Bezahlung...

    EOD
    Elmar

    • Als Antwort markiert Sandra Maier Freitag, 13. März 2015 11:47
    Mittwoch, 11. März 2015 15:07
    Beantworter

Alle Antworten

  • Hallo Sandra,
    wenn selbst der Windows Explorer sichtbar an der Menge von Dateien hängt, so wird es immer ein leistungsintensiver Vorgang sein.
    Da du schreibst, dass nur Dateien gelöscht werden sollen, die älter als 6 Tage sind, vermute ich mal das alles im selben Ordner liegt. Also auch die neueren Dateien. Dadurch fällt die Idee weg den gesamten Ordner zu löschen und ihn danach einfach neu anzulegen.
    So wirst du nicht drum herum kommen alle Dateien zu durchlaufen und anschließend zu löschen.

    Deine Anwendung sollte das besser in einem Hintergrundthread erledigen, damit die GUI des Programms reaktionsfähig bleibt. Eine Möglichkeit dazu wäre der von dir angesprochene BackgroundWorker, aber auch async in await in C# 5 oder ein manuell angelegter Thread kann dies erledigen.

    Die Idee mit dem Zippen und dann löschen würde die Situation nur noch verschlimmern.

    Das die CMD es scheinbar problemlos hin bekommt liegt daran, das diese auch einfach sequentiell alle Dateien nach einander löscht. So wie du es auch machen solltest. Auch die CMD hängt dabei - nur merkt man es nicht da man es ja so gewohnt ist, das man wärend eines Vorgangs nichts tun kann.

    PS: Um wie viele Dateien geht es hier eigentlich?


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 4. März 2015 16:23
    Moderator
  •  

    PS: Um wie viele Dateien geht es hier eigentlich?


    Hallo Tom,

    teils waren da schon 6000 Dateien in einem Ordner drin.

    OK, dann wäre 'nur' das Ordner löschen, die schnellere Alternative?

    Sehe ich das richtig? Bis dato wir ja jede Datei geprüft. Dann müßte man neuere Dateien anderweitig ablegen.

    Wichtig mal für mich, ja das kann schon sein, so sehe ich das jetzt als Bestätigung von Dir.

    Grüße Sandra

    Mittwoch, 4. März 2015 17:47
  • Hallo Sandra,

    was spricht denn dagegen die Aufgabe in einem Hintergrundthread auszulagern um sie dort auszuführen.

    Das geht sehr simpel und stoppt dann dei UI nicht, der User dürfte kaum was bemerken:

    void CleanUpLogs() { ParameterizedThreadStart pts = new ParameterizedThreadStart(InnerCleanFunc); Thread thread = new Thread(pts); thread.Start(null); } //Beispielmethode: private static void InnerCleanFunc(Object parameter) {

    //TRY string dirPath = GetLogDirectory(); //Wo sind die Logdateien? string[] filePaths = Directory.GetFiles(dirPath); foreach(string item in filePaths) {

    //TRY //Alter auslesen und ggf. löschen!! FileInfo fi = new FileInfo(item); //Alter TimeSpan sp = DateTime.UtcNow - fi.LastWriteTimeUtc; if(sp.TotalDays > 6) { //Älter als 6 Tage

    //TRY File.Delete(item); } } }


    PS: Ichw ürde an deiner Stelle noch ein paar TRY-Blöcke einbauen um Fehlerfreiheit zu garantieren. So z.B. dort, so //TRY steht.


    © 2015 Thomas Roskop

    Germany // Deutschland

    Mittwoch, 4. März 2015 17:59
  • Hallo Sandra,

    einen großen Unterschied macht es glaube nicht aus ob man den Ordner oder die Dateien löscht. Mit einer Ordnerstruktur (ein Ordner für jeden Tag), hättest du aber deutlich weniger Aufwand und wenn man mal eine Datei manuell öffnen muss ist auch der Explorer schneller.

    Die Dateisystem-Funktionen (Directory.Delete etc.) arbeitet IMHO alle synchron - das heißt das du den 2. Thread nach wie vor einbauen solltest. Denn auch das Löschen eines Ordners kann dauern.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 4. März 2015 18:02
    Moderator
  • Hi Sandra,

    es gibt unterschiedliche Open Source Logger, die das was du möchtest schon Integriert haben.

    Z.B. Log4Net.

    An denen kann man sich Orientieren oder auch einfach Benutzen. ;)

    MFG

    Björn

    Mittwoch, 4. März 2015 18:59
  • Z.B. Log4Net.

    An denen kann man sich Orientieren oder auch einfach Benutzen. ;)

    Hallo Björn,

    ja sicher, kannst Du das von Thomas Tipp konkretisieren? Die Funktionen nennen.

    D.h. die Bibliothek Log4Net lagert das dann in einen Thread aus?

    Die Logdateien anlegen macht jemand anders, ich soll diese nur löschen.

    Grüße Sandra

    Mittwoch, 4. März 2015 20:17
  • Hallo Sandra,

    nimm einfach ein Powershell Skript, siehe z. B.: Delete files older than 15 days using PowerShell

    Und man sollte es als geplante Aufgabe einrichten, so dass es in ruhigen Zeiten (z. B. nachts) läuft.

    Gruß Elmar

    Donnerstag, 5. März 2015 06:38
    Beantworter
  • nimm einfach ein Powershell Skript, siehe z. B.: Delete files older than 15 days using PowerShell

    Und man sollte es als geplante Aufgabe einrichten, so dass es in ruhigen Zeiten (z. B. nachts) läuft.

    Hallo Elmar,

    das will der Kunde wieder nicht. Einrichten etc.

    Ich soll eine Alternative bieten. Am einfachsten dann C:\XXXX\YYYYY\Hauptordner\

       Jetzt sollen alle Ordner unterhalb des Hauptordners ohne nachfragen gelöscht werden, die älter als 3 Tage sind. Welches Attribut ist da dann wirklich richtig? Teils ändert sich ja was, wenn ich nur reinklicke.

    Stichwort: Erstell-/Änderungsdatum.

    Vielleicht hast noch einen konkreten Ansatz mit Thread, BackgroundWorker etc.

    Grüße Sandra

    Samstag, 7. März 2015 11:49
  • Hallo Sandra,

    interessant was Kunden alles nicht wollen. Also 15 Minuten Einrichtung sind zu viel, aber ein Tag Programmierung wird bezahlt - letztes optimistisch geschätzt bei den vielen Fragen, die dieses triviale Problem hier aufwirft?

    Zum den Datei Daten siehe: Description of NTFS date and time stamps for files and folders und File Times (Windows)

    Eine Lösung als getrenntes Programm wäre leichter handhabbar, da man sie auch mal isoliert aufrufen kann - und via Process.Start integrierbar. Will man es unbedingt integrieren, wäre ein Thread (Background) die einfachste Lösung.

    Will man protokollieren, ist eine Datei der geeignetere Weg. Irgendwelches Gedudel bezüglich Bildschirm- Anzeigen würden ich unterlassen, wenn es so viele Dateien sind, das guckt sich eh keiner an.

    Ansonsten gilt: Du wirst erst alle Dateien löschen müssen und am Ende die leeren Ordner. Windows kennt nur Löschoperationen für Dateien und (leere) Verzeichnisse.

    Gruß Elmar

    Samstag, 7. März 2015 15:09
    Beantworter
  • interessant was Kunden alles nicht wollen. Also 15 Minuten Einrichtung sind zu viel, aber ein Tag Programmierung wird bezahlt - letztes optimistisch geschätzt bei den vielen Fragen, die dieses triviale Problem hier aufwirft?

    Hallo Elmar,
    ja so ist es. Dann geht die CPU
    rauf, dann wird man noch bestraft etc.
    Ziel:
     
    C:\XXXX\YYYYY\Hauptordner\
    Jetzt sollen alle Unterordner ohne nachfragen
    gelöscht werden.
    Geht das dann nicht ‘einfach’ so:
    Directory.Delete(topPath, true);

    Was schlägst Du konkret vor?

    Danke im Voraus.

    Viele liebe Grüße Sandra

    Montag, 9. März 2015 11:36
  • Hallo Sandra,

    wie bereits gesagt, kann man Verzeichnisse nur löschen, wenn keine Dateien mehr enthalten sind. Die Überladung von Delete ändert nichts daran. Auch dort werden zuerst alle Dateien gelöscht und am Ende das Verzeichnis. Funktioniert das aus irgendeinem Grund nicht - wie Datei im Zugriff - gibt es eine Ausnahme.

    Die Laufzeit ergibt sich also auch dann daraus, wie lange das Löschen der Dateien dauert.

    Ehrlich gesagt, weiß ich nicht, wie so man aus einer Mini-Aufgabe so ein Drama machen kann.... Programmiere es und gut ist.

    Gruß Elmar

    • Als Antwort markiert Sandra Maier Dienstag, 10. März 2015 10:59
    Montag, 9. März 2015 14:25
    Beantworter
  • Die Laufzeit ergibt sich also auch dann daraus, wie lange das Löschen der Dateien dauert.

    Ehrlich gesagt, weiß ich nicht, wie so man aus einer Mini-Aufgabe so ein Drama machen kann.... Programmiere es und gut ist.

    Hallo Elmar,

    ja ok, ich habe es ja mit einem BackgroundThread erstellt. Nun hängt teils die Anwendung, wenn zuviele Dateien geloggt werden. Ich vergleiche das Erstelldatum, wenn älter weg damit. Jetzt suche ich Alternativen.

    Evtl. gibt es Beispiel Codes.

    Sicher kann es sein, dass ein Fehler drin ist. Der Kunde will keine Lösung über Aufgabenplanung. Na ja, lassen wir es dabei halt.

    Grüße Sandra

    Dienstag, 10. März 2015 10:58
  • Hallo Sandra,

    jeder darf gute Ratschläge ignorieren, sollte sich aber dann nicht über das Ergebnis wundern...

    Ein Datenträger (insbes. nicht SSD) verarbeitet nur eine relative geringe Anzahl Zugriffe je Sekunde. Wenn viel protokolliert wird oder der Datenträger mit anderen Aufgaben ausgelastet ist, wird das gleichzeitige Löschen die Last nur vergrößern.

    Aus der Erkenntnis resultierte der Ratschlag, es auf eine Zeit geringer Aktivität zu verlegen ... was durch die Aufgabenplanung einfach realisierbar wäre ...

    Gruß Elmar

    • Als Antwort markiert Sandra Maier Freitag, 13. März 2015 11:47
    Dienstag, 10. März 2015 14:53
    Beantworter
  • Ein Datenträger (insbes. nicht SSD) verarbeitet nur eine relative geringe Anzahl Zugriffe je Sekunde. Wenn viel protokolliert wird oder der Datenträger mit anderen Aufgaben ausgelastet ist, wird das gleichzeitige Löschen die Last nur vergrößern.

    Hallo,

    mein Kunde hat da weniger Verständnis und denkt an falsche Programmierung.

    Gibt es zu Deiner These eine wissenschaftlich Seite, die ich dem Kunden vorschlagen kann?

    Grüße Sandra

    Mittwoch, 11. März 2015 14:50
  • Hallo Sandra,

    siehe u. a. http://www.techrepublic.com/blog/the-enterprise-cloud/calculate-iops-in-a-storage-array/

    alles weitere gibt es bei solchen "Kunden" nur gegen Bezahlung...

    EOD
    Elmar

    • Als Antwort markiert Sandra Maier Freitag, 13. März 2015 11:47
    Mittwoch, 11. März 2015 15:07
    Beantworter