Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除错误的文件_C#_Linq - Fatal编程技术网

C# 删除错误的文件

C# 删除错误的文件,c#,linq,C#,Linq,我正在尝试使用Linq查询获取目录中符合我的条件的文件。当我循环浏览列表的内容并输出到控制台时,它看起来像是在抓取60秒前创建的正确文件,但当我尝试循环浏览列表的内容并删除这些文件时,它会抓取其他文件,而不仅仅是那些超过60秒的文件 代码: public static void purgeOldLogs() { //Getting current Directory int LogPurgeTime = LogUtil.logPurgeTime; string direc

我正在尝试使用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);
    }
}
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);
}