File.GetCreationTime和fileInfo.CreationTime之间有什么区别?

时间:2014-05-09 22:08:24

标签: c# .net linq

目前我正在使用File.GetCreationTime来获取符合特定条件的文件:

List<string> files =
     Directory.GetFiles(directory, "*.doc", SearchOption.TopDirectoryOnly)
              .Where(x => x.Contains("SomeString"))
              .OrderByDescending(f => File.GetCreationTime(f))
              .Take(numberOfFiles)
              .ToList<string>();

我想添加选项以获取符合特定条件但仅来自last X days的文件,因此我需要将File.GetCreationTime更改为fileInfo.CreationTime

1 个答案:

答案 0 :(得分:1)

我会使用查询语法,因为它的声明性并允许为文件的创建时间引入范围变量:

var date = DateTime.Today.AddDays(-numberOfDays);
var searchOption = SearchOption.TopDirectoryOnly; // just to fit width of window

var files = from f in Directory.EnumerateFiles(directory, "*.doc", searchOption)
            let creationTime = File.GetCreationTime(f)
            where f.Contains("SomeString") && creationTime >= date
            orderby creationTime descending
            select f; // query will return IEnumerable<string>

如果你想使用lambda语法,那么第一个选项是将文件投射到具有文件名和创建时间的匿名对象序列中:

 var files =
  Directory.EnumerateFiles(directory, "*.doc", searchOption)
           .Where(f => f.Contains("SomeString"))
           .Select(f => new { Name = f, CreationTime = File.GetCreationTime(f) })
           .Where(x => x.CreationTime >= date)              
           .OrderByDescending(x => x.CreationTime)
           .Select(x => x.Name)
           .ToList();

另一种选择是FileInfo的使用 - 它比前一个更易读,但性能更差,因为应该创建FileInfo实例并使用有关文件的信息进行初始化:

 var dir = new DirectoryInfo(directory);
 var files = 
       dir.EnumerateFiles("*.doc", searchOption)
          .Where(f => f.Name.Contains("SomeString") && f.CreationTime > date)
          .OrderByDescending(f => f.CreationTime)
          .Select(f => f.Name)
          .ToList();

注意:因此您不需要目录中的所有文件,那么最好使用EnumerateFiles方法而不是获取所有文件的数组。