it-swarm-ja.tech

数日より古いファイルを削除する

これは、かなりのロギングを行うアプリケーションではかなり一般的な要件だと思います。私はC#Windowsアプリケーション.NET3.5に取り組んでいます。

私のアプリは、20091112のようにファイル名に現在の日付が入力された大量のログファイルを生成します。たとえば30日より古いファイルを削除するための最良の戦略は何でしょうか。これから使用するアプローチの1つは、ファイル名をループし、日付部分を抽出し、DateTimeオブジェクトに変換して、今日の日付と比較することです。これに対するエレガントな正規表現ソリューションはありますか:)?それとももっと良いものですか?

25
theraneman
var files = new DirectoryInfo(@"c:\log").GetFiles("*.log");
foreach (var file in files)
{
    if (DateTime.UtcNow - file.CreationTimeUtc > TimeSpan.FromDays(30))
    {
        File.Delete(file.FullName);
    }
}
33
Darin Dimitrov

。net 4.0を更新:

var files = new DirectoryInfo(directoryPath).GetFiles("*.log");
foreach (var file in files.Where(file => DateTime.UtcNow - file.CreationTimeUtc > TimeSpan.FromHours(2))) {
     file.Delete();
}
10
PernerOl

私が理解しているように、変更時間ではなくファイル名を使用したいと考えています。結構です。

その場合、コードは次のようになります。

    foreach (string file in Directory.GetFiles(path))
    {
        string fileNameOnly=Path.GetFileNameWithoutExtension(file);
        DateTime fileDate = DateTime.ParseExact(fileNameOnly, "yyyyMMDD", CultureInfo.CurrentCulture);
        if (DateTime.Now.Subtract(fileDate).TotalDays > MaxDays)
            File.Delete(file);
    }
1
yu_sha

[PowerShellの場合]以下をPS1ファイルに貼り付けて、必要に応じて管理スクリプトの一部にすることができます。-

param($ path = $(throw "パスを示す必要があります")、$ daysToRetain = $(throw "保持する日数を示す必要があります"))

dir $ path -r | ? {([datetime] :: UtcNow- $_。CreationTimeUtc).TotalDays -gt $ daysToRetain} |デル

編集:ファイル時間を使用することが適切ではないと思われる場合は、-matchを使用して名前を解析できます

1
Ruben Bartelink
string directoryPath = "/log"; // your log directory path

foreach (string filePath in Directory.GetCreationTime(directoryPath))
{
    TimeSpan fileAge = File.GetLastWriteTime(filePath) - DateTime.Now;
    if (fileAge.Days > 30)
    {
        File.Delete(filePath);
    }
}
1
bniwredyc

2つのDateTimeオブジェクトを減算すると、TimeSpanオブジェクトが得られ、そのTotalDaysプロパティを確認できます。これ以上簡単なことは考えられません。

0
Konamiman