C#删除错误的文件

时间:2018-06-28 08:54:43

标签: c# linq

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

2 个答案:

答案 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