Подтвердить что ты не робот

Удаление файлов старше нескольких дней

Я предполагаю, что это довольно распространенное требование в приложении, которое выполняет довольно много протоколирования. Я работаю над приложением Windows С#.NET 3.5.

Мое приложение генерирует множество файлов журналов, которые содержат текущую дату, помещенную в имя файла, например, 20091112. Какая будет лучшая стратегия для удаления файлов старше 30 дней. Один из подходов, который я собираюсь использовать, - это прокрутить имена файлов, извлечь часть даты, преобразовать в объект DateTime и сравнить с сегодняшней датой. Есть ли элегантное решение регулярного выражения для этого:)? Или что-то лучше?

4b9b3361

Ответ 1

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);
    }
}

Ответ 2

update.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();
}

Ответ 3

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);
    }
}

Ответ 4

Как я понимаю, вы хотите использовать имя файла, а не время модификации. Хорошо.

Затем код выглядит так:

    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);
    }

Ответ 5

[В PowerShell] вы можете вставить следующее в файл PS1 и сделать его частью admin script, если это подходит: -

param ($ path = $(throw "Нужно указать путь" ), $daysToRetain = $(throw "Необходимо указать, сколько дней нужно сохранить" ))

dir $path -r |? {([datetime]:: UtcNow - $_. CreationTimeUtc).TotalDays -gt $daysToRetain} | дель

РЕДАКТИРОВАТЬ: И вы можете использовать -match для синтаксического анализа имени, если вы считаете, что время файла не соответствует действительности.

Ответ 6

Выделение двух объектов DateTime даст вам объект TimeSpan, тогда вы можете просто проверить его свойство TotalDays. Я не могу придумать ничего более простого, чем это.

Ответ 7

string[] files = Directory.GetFiles(path);
foreach (string file in files)
 {
  if (File.GetLastWriteTime(file) < DateTime.Now.AddDays(-5))
    {
      File.Delete(file);
    }
 }