我正在尝试使用Linq查询来获取目录中符合我条件的文件。当我遍历列表内容并将其输出到控制台时,似乎正在抓取正确的文件(任何超过60秒前创建的文件),但是当我尝试遍历列表内容并删除这些文件时,它正在获取其他文件,而不是仅仅超过60秒的文件。
代码:
public static void purgeOldLogs()
{
//Getting current Directory
int LogPurgeTime = LogUtil.logPurgeTime;
string directory = Directory.GetCurrentDirectory();
DirectoryInfo dir = new DirectoryInfo(directory);
//checking for older log files
List<string> files = dir.GetFiles()
.Where(x => x.Name.StartsWith("webMonlog") && x.CreationTime < DateTime.Now.AddSeconds(LogPurgeTime))
.Select(x => x.FullName)
.ToList();
Console.WriteLine("Getting old Log Files...");
foreach (var file in files)
{
FileInfo fileToDelete = new FileInfo(file);
fileToDelete.Delete();
Console.WriteLine(file);
}
}
答案 0 :(得分:2)
除非LogPurgeTime
为负值,否则DateTime.Now.AddSeconds(LogPurgeTime)
表示将来60秒的时间。所有文件的创建时间都将早于此时间。
虽然并没有添加-
并写例如:
x.CreationTime < DateTime.Now.AddSeconds(-LogPurgeTime)
您可以预先计算时间实例:
var latestTime=DateTime.Now.AddSeconds(-LogPurgeTime);
....
.Where(x => x.Name.StartsWith("webMonlog") && x.CreationTime < latestTime)
更好的是,将LogUtil.logPurgeTime
的类型更改为TimeSpan。这样,您就不必对整数值的含义进行假设,也不必检查它是正数还是负数。
var latestTime = DateTime.Now - LogUtil.logPurgeTime;
....
.Where(x => x.Name.StartsWith("webMonlog") && x.CreationTime < latestTime)
在日志配置代码中,您可以解析一个字符串以设置属性,例如:
LogUtils.logPurgeTime = TimeSpan.Parse("00:01");
最后,DirectoryInfo.GetFiles
返回FileInfo
个对象。无需获取FullName即可重新创建FileInfo对象。无需在过滤之前将所有FileInfo加载到内存中。 EnumerateFiles返回一个IEnumerable,该IEnumerable立即开始返回结果。最后,GetFiles和EnumerateFiles都接受通配符搜索模式。
代码可以简化为:
var latestTime = DateTime.Now - LogUtil.logPurgeTime;
var pattern = "webMonlog*";
var files = dir.EnumerateFiles(pattern)
.Where(x => x.CreationTime < latestTime)
.ToList();
Console.WriteLine("Getting old Log Files...");
foreach (var file in files)
{
file.Delete();
Console.WriteLine(file.FullName);
}
答案 1 :(得分:0)
CreationTime
始终低于DateTime.Now.AddSeconds(LogPurgeTime)
。
您想要的是DateTime.Now - TimeSpan.FromSeconds(Math.Abs(LogPurgeTime)) > x.CreationTime