パラメータとしてディレクトリパスを取得し、キーがそのディレクトリの直下のファイルであり、値が最終変更時刻である辞書を返す関数を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