我正在尝试编写一个C#函数,该函数将目录路径作为参数并返回一个字典,其中键是该目录下直接的文件,值是它们的最后修改时间。使用Directory.GetFiles()然后File.GetLastWriteTime()很容易实现。但是,这意味着必须访问每个文件,这对我的需求来说太慢了。有没有一种方法可以在仅访问目录的情况下完成此操作?文件系统是否支持这种要求?
编辑后,阅读了一些答案: 谢谢你们,你们都说得非常相似 - 使用FileInfo对象。但是,使用Directory.GetFiles()(或Directory.EnumerateFiles())获取这些对象同样很慢,我怀疑获取它们需要访问每个文件。如果文件系统仅在文件本身中保留其文件的最后修改时间,则无法提取该信息而不进行文件访问。在这里是这种情况吗? DirectoryInfo的GetFiles()和EnumerateFiles()会访问每个文件还是从目录条目中获取文件信息?我知道,如果我只想获取文件名,我可以使用Directory类而不必访问每个文件。但是获取属性似乎更加棘手...
根据henk的回复,似乎使用FileInfo Object确实更快。我创建了以下测试:
编辑后,阅读了一些答案: 谢谢你们,你们都说得非常相似 - 使用FileInfo对象。但是,使用Directory.GetFiles()(或Directory.EnumerateFiles())获取这些对象同样很慢,我怀疑获取它们需要访问每个文件。如果文件系统仅在文件本身中保留其文件的最后修改时间,则无法提取该信息而不进行文件访问。在这里是这种情况吗? DirectoryInfo的GetFiles()和EnumerateFiles()会访问每个文件还是从目录条目中获取文件信息?我知道,如果我只想获取文件名,我可以使用Directory类而不必访问每个文件。但是获取属性似乎更加棘手...
根据henk的回复,似乎使用FileInfo Object确实更快。我创建了以下测试:
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now);
foreach (string file in Directory.GetFiles(@"\\169.254.78.161\dir"))
{
DateTime x = File.GetLastWriteTime(file);
}
Console.WriteLine(DateTime.Now);
DirectoryInfo dirInfo2 = new DirectoryInfo(@"\\169.254.78.161\dir");
var files2 = from f in dirInfo2.EnumerateFiles()
select f;
foreach (FileInfo file in files2)
{
DateTime x = file.LastWriteTime;
}
Console.WriteLine(DateTime.Now);
}
对于大约800个文件,我通常会得到类似以下的结果:
2011年8月31日17:14:48
2011年8月31日17:14:51
2011年8月31日17:14:52