作成タイムスタンプの日付部分のみを考慮することを余儀なくされた場合、条件が満たされ、ファイルは(以前に)削除されます。とにかく、そのコードにいくつかの変更を加えることをお勧めします。
static class Helpers {
public static void DeleteOldFiles(string folderPath, uint maximumAgeInDays,
params string[] filesToExclude) {
DateTime minimumDate = DateTime.Now.AddDays(-maximumAgeInDays);
var filesToDelete = Directory.EnumerateFiles(folderPath)
.Where(x => !IsExcluded(x, filesToExclude));
foreach (var eligibleFileToDelete in filesToDelete)
DeleteFileIfOlderThan(eligibleFileToDelete, minimumDate);
}
private const int RetriesOnError = 3;
private const int DelayOnRetry = 1000;
private static bool IsExcluded(string item, string[] exclusions) {
return exclusions.Contains(item, StringComparer.CurrentCultureIgnoreCase);
}
private static void DeleteFileIfOlderThan(string path, DateTime date)
{
for (int i = 0; i < RetriesOnError; ++i) {
try {
var file = new FileInfo(path);
if (file.CreationTime < date)
file.Delete();
}
catch (IOException) {
System.Threading.Thread.Sleep(DelayOnRetry);
}
catch (UnauthorizedAccessException) {
System.Threading.Thread.Sleep(DelayOnRetry);
}
}
}
}
ノート
- 私はまだ使用して
DateTime.Now
います。この種の操作では、正確な測定は必要ないと思います(そして、数日について話しているので、スレッドには数時間のスケジュールが設定されている可能性があります)。
- アプリケーションで複数のログファイルを使用する場合は、それらすべてをパラメータとして指定でき、無視されます。
DeleteOldFiles
0を指定して呼び出すとmaximumAgeInDays
、使用されていないすべてのログファイルが遅延します(除外リストで指定されているとおり)。
- ファイルが使用されている場合があります(これがあなたのケースではめったに起こらない場合でも)。この
DeleteFileIfOlderThan
関数は、少し遅れて削除を再試行します(Explorer.exe
動作を模倣します)。
この関数は次のように呼び出すことができます。
Helpers.DeleteOldFiles(@"c:\mypath\", logAge, currentLog);
もう少しメモ:
- このコードはパスとファイル名を組み合わせていませんが、それを行う必要がある場合は、を使用する必要があります
Path.Combine()
。パスが末尾の円記号で終わっているかどうかを確認するために、毎回車輪の再発明をしたくないと思います。
- I / O操作が失敗する可能性があります!常に例外を確認してください。