C# 删除错误的文件
我正在尝试使用Linq查询获取目录中符合我的条件的文件。当我循环浏览列表的内容并输出到控制台时,它看起来像是在抓取60秒前创建的正确文件,但当我尝试循环浏览列表的内容并删除这些文件时,它会抓取其他文件,而不仅仅是那些超过60秒的文件 代码:C# 删除错误的文件,c#,linq,C#,Linq,我正在尝试使用Linq查询获取目录中符合我的条件的文件。当我循环浏览列表的内容并输出到控制台时,它看起来像是在抓取60秒前创建的正确文件,但当我尝试循环浏览列表的内容并删除这些文件时,它会抓取其他文件,而不仅仅是那些超过60秒的文件 代码: public static void purgeOldLogs() { //Getting current Directory int LogPurgeTime = LogUtil.logPurgeTime; string direc
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);
}
}
CreationTime始终低于DateTime.Now.AddSecondsLogPurgeTime
您需要的是DateTime.Now-TimeSpan.fromssecondsmath.AbsLogPurgeTime>x.CreationTime除非LogPurgeTime是负值,否则DateTime.Now.AddSecondsLogPurgeTime指的是未来60秒的时间。所有文件的创建时间都将早于此
而不是仅仅添加一个符号,然后写下例如:
x.CreationTime < DateTime.Now.AddSeconds(-LogPurgeTime)
在日志配置代码中,您可以解析字符串以设置属性,例如:
LogUtils.logPurgeTime = TimeSpan.Parse("00:01");
最后,DirectoryInfo.GetFiles返回FileInfo对象。仅仅为了重新创建FileInfo对象,不需要获取全名。在筛选文件信息之前,无需在内存中加载所有文件信息。返回立即开始返回结果的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);
}
它正在抓取额外的文件-不,它没有。字符串列表中的文件名没有什么特别之处。foreach循环不会构成文件中不存在的要删除的文件。进行更多的调试并创建一个包含输入和输出的示例。那么,是什么让您认为它们是错误的文件,当您调试它时,这些文件上的日期时间是多少。如果logPurgeTime是正数,您应该使用DateTime.Now.AddSeconds-logPurgeTime我认为这些文件是错误的,因为当我将列表写入控制台时,文件看起来是正确的,但当我删除列表中的文件时,一个在我将其写入控制台时不在列表中的文件正在被删除。@user9175041如果logPurgeTime大于零,则选择在未来日期之前创建的所有文件。除非logPurgeTime为负。如果为正,则表达式应为DateTime.Now.AddSeconds-LogPurgeTime。它相当于DateTime.Now-TimeSpan.fromsecondsslogpurgetimethodat是真的,但非常违反直觉。DateTime.Now.AddSeconds-someValue是一个非常常见的表达式。把这篇文章放在写作上,基本上颠覆了人们如何看待表达方式,这是令人困惑的。@ PANAGIOTIKSANAVOS,我添加了数学。ABS,所以现在的符号是什么都不重要。你还认为这更直观吗?现在不太清楚条件是什么,比较的是哪个字段。有趣的事实——IBM的DB2团队希望在SQL早期强制执行这个语法值op字段,因为它使他们更容易解析。就连SQL委员会中的IBM人也反叛了
LogUtils.logPurgeTime = TimeSpan.Parse("00:01");
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);
}