Ответ 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);
}
}
Я предполагаю, что это довольно распространенное требование в приложении, которое выполняет довольно много протоколирования. Я работаю над приложением Windows С#.NET 3.5.
Мое приложение генерирует множество файлов журналов, которые содержат текущую дату, помещенную в имя файла, например, 20091112. Какая будет лучшая стратегия для удаления файлов старше 30 дней. Один из подходов, который я собираюсь использовать, - это прокрутить имена файлов, извлечь часть даты, преобразовать в объект DateTime и сравнить с сегодняшней датой. Есть ли элегантное решение регулярного выражения для этого:)? Или что-то лучше?
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);
}
}
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();
}
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);
}
}
Как я понимаю, вы хотите использовать имя файла, а не время модификации. Хорошо.
Затем код выглядит так:
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);
}
[В PowerShell] вы можете вставить следующее в файл PS1 и сделать его частью admin script, если это подходит: -
param ($ path = $(throw "Нужно указать путь" ), $daysToRetain = $(throw "Необходимо указать, сколько дней нужно сохранить" ))
dir $path -r |? {([datetime]:: UtcNow - $_. CreationTimeUtc).TotalDays -gt $daysToRetain} | дель
РЕДАКТИРОВАТЬ: И вы можете использовать -match
для синтаксического анализа имени, если вы считаете, что время файла не соответствует действительности.
Выделение двух объектов DateTime
даст вам объект TimeSpan
, тогда вы можете просто проверить его свойство TotalDays
. Я не могу придумать ничего более простого, чем это.
string[] files = Directory.GetFiles(path);
foreach (string file in files)
{
if (File.GetLastWriteTime(file) < DateTime.Now.AddDays(-5))
{
File.Delete(file);
}
}