使用.NET删除目录中超过3个月的文件

JL.*_*JL. 106 .net c# directory file

我想知道(使用C#)我如何删除超过3个月的某个目录中的文件,但我想日期可以灵活.

需要明确的是:我正在寻找超过90天的文件,换句话说,应该保留不到90天前创建的文件,其他所有文件都被删除.

Ste*_*ner 241

像这样的东西做的事情.

using System.IO; 

string[] files = Directory.GetFiles(dirName);

foreach (string file in files)
{
   FileInfo fi = new FileInfo(file);
   if (fi.LastAccessTime < DateTime.Now.AddMonths(-3))
      fi.Delete();
}
Run Code Online (Sandbox Code Playgroud)

  • 不,正如propertyNames所说:`LastAccessTime` - 如果你愿意,你应该选择属性`CreationTime`! (8认同)
  • 我想GetFiles和Delete在您的环境中永远不会失败?只是指出这一点,因为这似乎是一个高度引用的答案. (5认同)
  • 是的,你使用哪种财产完全取决于你.如果需要,您也可以使用LastWriteTime. (3认同)
  • +1帮助我.您可以使用File.GetCreationTime或File.GetLastAccessTime而不是创建新的FileInfo实例.应该是一个小的性能改进. (3认同)
  • 为什么要评估每个循环 DateTime.Now.AddMonths(-3) ? (2认同)

Uri*_*son 81

这是一个单线lambda:

Directory.GetFiles(dirName)
         .Select(f => new FileInfo(f))
         .Where(f => f.LastAccessTime < DateTime.Now.AddMonths(-3))
         .ToList()
         .ForEach(f => f.Delete());
Run Code Online (Sandbox Code Playgroud)

  • 对于每个文件,“new DirectoryInfo(dir).GetFiles()”都比“new FileInfo(f)”更快。 (3认同)
  • 我喜欢这个。但是我会将删除内容包装在try / catch中 (2认同)

Sam*_*eff 27

对于那些喜欢过度使用LINQ的人.

(from f in new DirectoryInfo("C:/Temp").GetFiles()
 where f.CreationTime < DateTime.Now.Subtract(TimeSpan.FromDays(90))
 select f
).ToList()
    .ForEach(f => f.Delete());
Run Code Online (Sandbox Code Playgroud)

  • Woho!除了我以外的其他人认为过度使用LINQ真棒!;) (2认同)
  • @Joel Mueller.`List <T>`定义了一个`ForEach`方法,可用于将`Action <T>`应用于所有元素.不幸的是,`IEnumerable <T>`没有这样的扩展方法. (2认同)

Pie*_*gny 13

以下是如何获取目录中文件的创建时间以及查找已在3个月前创建的文件(确切地说是90天前)的片段:

    DirectoryInfo source = new DirectoryInfo(sourceDirectoryPath);

    // Get info of each file into the directory
    foreach (FileInfo fi in source.GetFiles())
    {
        var creationTime = fi.CreationTime;

        if(creationTime < (DateTime.Now- new TimeSpan(90, 0, 0, 0)))
        {
            fi.Delete();
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 你应该在`foreach()`循环之外声明一个新变量来保存`(DateTime.Now- new TimeSpan(90,0,0,0))`的值.没有理由在循环中反复计算. (3认同)

Tol*_*lga 9

当想要在特定持续时间内删除文件时,最规范的方法是使用文件的 LastWriteTime(上次修改文件的时间):

Directory.GetFiles(dirName)
         .Select(f => new FileInfo(f))
         .Where(f => f.LastWriteTime < DateTime.Now.AddMonths(-3))
         .ToList()
         .ForEach(f => f.Delete());
Run Code Online (Sandbox Code Playgroud)

(以上内容基于 Uri 的回答,但带有LastWriteTime。)

每当您听到人们谈论删除早于特定时间范围的文件(这是一种非常常见的活动)时,他们几乎总是在寻找基于文件的 LastModifiedTime 的操作。

或者,对于非常不寻常的情况,您可以使用以下内容,但请谨慎使用,因为它们带有警告。

CreationTime
.Where(f => f.CreationTime < DateTime.Now.AddMonths(-3))
Run Code Online (Sandbox Code Playgroud)

在当前位置创建文件的时间。但是,请注意,如果文件被复制,它将是复制的时间,并且CreationTime文件的LastWriteTime.

LastAccessTime
.Where(f => f.LastAccessTime < DateTime.Now.AddMonths(-3))
Run Code Online (Sandbox Code Playgroud)

如果您想根据上次读取的时间删除文件,您可以使用它,但是不能保证它会被更新,因为它可以在 NTFS 中禁用。检查fsutil behavior query DisableLastAccess它是否已打开。此外,在 NTFS 下,文件的 LastAccessTime 在访问后可能需要长达一个小时才能更新。