3

我正在尝试在 C# 中编写一个函数,该函数获取一个目录路径作为参数并返回一个字典,其中键是该目录下的文件,值是它们的最后修改时间。使用 Directory.GetFiles() 和 File.GetLastWriteTime() 很容易做到这一点。但是,这意味着必须访问每个文件,这对于我的需要来说太慢了。仅访问目录时有没有办法做到这一点?文件系统甚至支持这种要求吗?

编辑,在阅读了一些答案后:谢谢你们,你们都说得差不多——使用 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 个文件,我通常会得到如下信息:
31/08/2011 17:14:48
31/08/2011 17:14:51 31/08/2011
17:14:52

4

2 回答 2

2

我没有做任何计时,但你最好的选择是:

DirectoryInfo di = new DirectoryInfo(myPath);
FileInfo[] files = di.GetFiles();

我认为目录文件记录中的所有 FileInfo 属性都可用,因此这应该(可能)需要最少的 I/O。

于 2011-08-31T12:00:09.900 回答
1

我能想到的唯一另一件事是使用FileInfo -Class。据我所知,这可能会对您有所帮助,或者它也可能会读取文件(需要读取权限)

于 2011-08-31T11:41:29.773 回答