我想这是一个非常常见的要求,在一个应用程序中进行了大量的日志记录。我正在开发一个C#Windows应用程序.NET 3.5。
我的应用程序会生成大量日志文件,其当前日期放在文件名中,如此版本20091112.删除早于30天的文件的最佳策略是什么。 我即将使用它的一种方法是遍历文件名,提取日期部分,转换为DateTime对象并与今天的日期进行比较。 这是一个优雅的正则表达式解决方案:)?还是更好的东西?
答案 0 :(得分:33)
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);
}
}
答案 1 :(得分:10)
更新.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();
}
答案 2 :(得分:1)
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);
}
}
答案 3 :(得分:1)
据我了解,您希望使用文件名而不是修改时间。细
然后代码是这样的:
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);
}
答案 4 :(得分:1)
[在PowerShell中]您可以将以下内容粘贴到PS1文件中,并将其作为管理脚本的一部分(如果适用): -
param($ path = $(throw“需要指明路径”),$ daysToRetain = $(抛出“需要指明要保留多少天”))
dir $ path -r | ? {([datetime] :: UtcNow - $ _。CreationTimeUtc).TotalDays -gt $ daysToRetain} |德尔
编辑:如果您认为使用文件时间不是正确的事情,您可以使用-match
来解析名称
答案 5 :(得分:0)
减去两个DateTime
对象将为您提供一个TimeSpan
对象,然后您可以检查其TotalDays
属性。我想不出比这更简单的东西。
答案 6 :(得分:0)
string[] files = Directory.GetFiles(path);
foreach (string file in files)
{
if (File.GetLastWriteTime(file) < DateTime.Now.AddDays(-5))
{
File.Delete(file);
}
}