【发布时间】:2012-12-13 18:01:20
【问题描述】:
.NET Directory.GetFiles 中有一个很好的功能,当我需要从目录中获取所有文件时使用它很简单。
Directory.GetFiles("c:\\Files")
但是,如果有很多创建时间不同的文件,我如何(什么模式)只获取创建时间今天的文件?
谢谢!
【问题讨论】:
.NET Directory.GetFiles 中有一个很好的功能,当我需要从目录中获取所有文件时使用它很简单。
Directory.GetFiles("c:\\Files")
但是,如果有很多创建时间不同的文件,我如何(什么模式)只获取创建时间今天的文件?
谢谢!
【问题讨论】:
试试这个:
var todayFiles = Directory.GetFiles("path_to_directory")
.Where(x => new FileInfo(x).CreationTime.Date == DateTime.Today.Date);
【讨论】:
为了提高性能,尤其是在目录搜索可能很大的情况下,使用 Directory.EnumerateFiles() 懒惰地枚举搜索路径优于 Directory.GetFiles(),它急切地枚举搜索路径,收集所有匹配项在过滤任何之前:
DateTime today = DateTime.Now.Date ;
FileInfo[] todaysFiles = new DirectoryInfo(@"c:\foo\bar")
.EnumerateFiles()
.Select( x => {
x.Refresh();
return x;
})
.Where( x => x.CreationTime.Date == today || x.LastWriteTime == today )
.ToArray()
;
请注意,FileSystemInfo 及其子类型的属性可以(并且是)缓存,因此它们不一定反映当前的实际情况。因此,调用Refresh() 以确保数据正确。
【讨论】:
System.Linq,您将看不到Linq 扩展方法。 msdn.microsoft.com/en-us/library/system.linq(v=vs.110).aspx
.LastWriteTime 包含在.Where 部分中? OP询问了“今天创造的时间”。我错过了什么?
你需要获取文件的目录信息
public List<String> getTodaysFiles(String folderPath)
{
List<String> todaysFiles = new List<String>();
foreach (String file in Directory.GetFiles(folderPath))
{
DirectoryInfo di = new DirectoryInfo(file);
if (di.CreationTime.ToShortDateString().Equals(DateTime.Now.ToShortDateString()))
todaysFiles.Add(file);
}
return todaysFiles;
}
【讨论】:
FileInfo 和 Date.Today,但感谢您指出不使用 LINQ 的正确方法
您可以使用以下代码:
var directory = new DirectoryInfo("C:\\MyDirectory");
var myFile = (from f in directory.GetFiles()
orderby f.LastWriteTime descending
select f).First();
// or...
var myFile = directory.GetFiles()
.OrderByDescending(f => f.LastWriteTime)
.First();
请看这里:How to find the most recent file in a directory using .NET, and without looping?
【讨论】:
使用 System.Linq;
DirectoryInfo info = new DirectoryInfo("");
FileInfo[] files = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();
foreach (FileInfo file in files)
{
// DO Something...
}
如果您想将其分解为特定日期,您可以使用过滤器尝试此操作
var files = from c in directoryInfo.GetFiles()
where c.CreationTime >dateFilter
select c;
【讨论】:
你应该可以通过这个:
var loc = new DirectoryInfo("C:\\");
var fileList = loc.GetFiles().Where(x => x.CreationTime.ToString("dd/MM/yyyy") == currentDate);
foreach (FileInfo fileItem in fileList)
{
//Process the file
}
【讨论】:
var directory = new DirectoryInfo(Path.GetDirectoryName(@"--DIR Path--"));
DateTime from_date = DateTime.Now.AddDays(-5);
DateTime to_date = DateTime.Now.AddDays(5);
//For Today
var filesLst = directory.GetFiles().AsEnumerable()
.Where(file.CreationTime.Date == DateTime.Now.Date ).ToArray();
//For date range + specific file extension
var filesLst = directory.GetFiles().AsEnumerable()
.Where(file => file.CreationTime.Date >= from_date.Date && file.CreationTime.Date <= to_date.Date && file.Extension == ".txt").ToArray();
//To get ReadOnly files from directory
var filesLst = directory.GetFiles().AsEnumerable()
.Where(file => file.IsReadOnly == true).ToArray();
//To get files based on it's size
int fileSizeInKB = 100;
var filesLst = directory.GetFiles().AsEnumerable()
.Where(file => (file.Length)/1024 > fileSizeInKB).ToArray();
【讨论】: