Im Artikel „Dateien automatisiert löschen, die älter als x-Tage/Datum sind“ habe ich vor langer Zeit gezeigt, wie man Dateien mittels Batch-Datei löschen kann, die ein bestimmtes Alter überschritten haben. Eine solche Funktion ist sinnvoll, wenn man beispielsweise Logfiles nur eine gewisse Zeit vorhalten und verhindern möchte, dass die Festplatte voll läuft.
Eine ähnliche Funktion werden wir heute schreiben, jedoch mittels C#. Ziel ist es hier, dass eine Anwendung selbst ihr Logfile-Verzeichnis überwacht und Dateien löscht, die älter als X-Tage sind.
Die nachfolgende Funktion „DeleteFiles“ erledigt dies für uns. Der Funktion muss das entsprechende Verzeichnis (Pfad als String) und die Anzahl tage (als Integer) übergeben werden. Dann ruft die Funktion das Verzeichnis auf und ermittelt alle Files, die im Verzeichnis liegen. Auskommentiert ist ein TXT-Filter. Wenn also ein bestimmter Dateityp im Verzeichnis überwacht werden soll, kann „GetFiles(„*“)“ in beispielsweise „GetFiles(„*txt“)“ geändert werden.
In der folgenden foreach-Schleife gehen wir die ermittelten Files durch und ermitteln das Datum der Datei. Hier stoßen wir auf das erste Problem. Sinnvoll klingt das „fi.CreationTime“. In den meisten Fällen ist dies auch das Datum, nach welchem wir uns richten möchten. Leider handelt es sich bei diesem Datum nicht um das Datum, welches wir im Explorer bei einer Datei „sehen“. Wenn wir die Dateien beispielsweise von A nach B kopieren, bleibt das File-Datum im Explorer bestehen, die „CreationTime“ ist jedoch neu gesetzt. Abhilfe KANN das „LastWriteTime“ schaffen. Gerade bei Logfiles sollte dies zum gewünschten Ergebnis führen.
Der restliche Code ist hier sehr umständlich, damit man ihn gut nachvollziehen kann. Wir ermitteln mittels TimeSpan die Differenz zwischen File-Datum und aktuellem Datum (Double), und konvertieren es in einen Integer-Wert. In der folgenden If-Abfrage schauen wir nach, ob die Differenz in Tagen über einem bestimmten Wert liegt. Wenn ja, löschen wir das File.
Im nachfolgenden Beispiel sind noch Aufrufe zur Funktion „LogFile“, die natürlich individuell angepasst werden müssen.
public void DeleteFiles(string sDirectory, int iTage) { DirectoryInfo di; FileInfo[] files; try { //ermittel das Verzeichnis di = new DirectoryInfo(sDirectory); //existiert das Verzeichnis? if (Directory.Exists(sDirectory)) { //files = di.GetFiles("*txt"); files = di.GetFiles("*"); foreach (FileInfo fi in files) { //fi.CreationTime; CreationTime klappt nicht bei kopierten Dateien! DateTime dtFile = fi.LastWriteTime; TimeSpan t = DateTime.Now - dtFile; double NrOfDays = t.TotalDays; int iAlter = Convert.ToInt32(NrOfDays); // Lösche die Dateien if (iAlter >= iTage) fi.Delete(); } } else LogFile("Fehler in DeleteFiles: Das übergebene Directory ("+ sDirectory + ") existiert nicht!"); } catch (Exception ex) { LogFile("Fehler in DeleteFiles: " + ex.Message); } }