我正在尝试在C#中编写一个函数,它将目录路径作为参数并返回一个字典,其中键是直接位于该目录下的文件,值是它们的最后修改时间。 使用Directory.GetFiles()和File.GetLastWriteTime()很容易。但是,这意味着必须访问每个文件,这对我的需求来说太慢了。 有没有办法在访问目录时执行此操作?文件系统是否支持这种要求?
在阅读一些答案后编辑: 谢谢大家,你们都说的几乎一样 - 使用FileInfo对象。尽管如此,使用Directory.GetFiles()(或Directory.EnumerateFiles())来获取这些对象同样慢,我怀疑获取它们需要访问每个文件。如果文件系统仅在文件本身中保留其文件的最后修改时间,则无法在没有文件访问的情况下提取该信息。这是这种情况吗? DirectoryInfo的GetFiles()和EnumerateFiles()是否访问每个文件或从目录条目中获取它们的信息?我知道如果我想获得文件名,我可以使用Directory类执行此操作而无需访问每个文件。但获取属性似乎更棘手......
编辑,跟着henk的回复: 似乎使用FileInfo对象确实更快。我创建了以下测试:
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个文件,我通常得到类似的东西:
31/08/2011 17:14:48
31/08/2011 17:14:51
31/08/2011 17:14:52
答案 0 :(得分:2)
我没有做任何时间,但你最好的选择是:
DirectoryInfo di = new DirectoryInfo(myPath);
FileInfo[] files = di.GetFiles();
我认为所有FileInfo属性都可以在目录文件记录中使用,因此这应该(可能)需要最小的I / O.
答案 1 :(得分:1)
我唯一能想到的是使用FileInfo - Class。据我所知,这可能对您有帮助,也可能会读取文件(需要读取权限)