3

パラメータとしてディレクトリパスを取得し、キーがそのディレクトリの直下のファイルであり、値が最終変更時刻である辞書を返す関数をC#で作成しようとしています。これは、Directory.GetFiles()、次にFile.GetLastWriteTime()を使用して簡単に実行できます。ただし、これはすべてのファイルにアクセスする必要があることを意味し、私のニーズには遅すぎます。ディレクトリだけにアクセスしながらこれを行う方法はありますか?ファイルシステムはこの種の要件もサポートしていますか?

編集、いくつかの回答を読んだ後:皆さん、ありがとうございます、あなたはほとんど同じことを言っています-FileInfoオブジェクトを使用してください。それでも、Directory.GetFiles()(またはDirectory.EnumerateFiles())を使用してこれらのオブジェクトを取得するのは同じくらい遅く、それらを取得するにはすべてのファイルにアクセスする必要があると思います。ファイルシステムがファイルの最終変更時刻をファイル自体にのみ保持している場合、ファイルにアクセスせずにその情報を抽出する方法はありません。これはここに当てはまりますか?DirectoryInfoのGetFiles()およびEnumerateFiles()はすべてのファイルにアクセスしますか、それともディレクトリエントリからそれらの情報を取得しますか?ファイル名だけを取得したい場合は、すべてのファイルにアクセスせずにDirectoryクラスを使用してこれを実行できることを知っています。しかし、属性を取得するのは難しいようです...

ヘンクの応答に従って編集します。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

4

2 に答える 2

2

私はタイミングを取りませんでしたが、あなたの最善の策は次のとおりです。

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

すべてのFileInfo属性がディレクトリファイルレコードで利用可能であると思うので、これには最小限のI / Oが必要です(可能性があります)。

于 2011-08-31T12:00:09.900 に答える
1

私が考えることができる他の唯一のことは、FileInfoクラスを使用することです。私が見る限り、これはあなたを助けるかもしれないし、ファイルを読むかもしれません(読み取り許可が必要です)

于 2011-08-31T11:41:29.773 に答える