目前我正在使用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
答案 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方法而不是获取所有文件的数组。