2009-10-30 21 views
7

実際にすべてのファイルをトラバースすることなく、ディレクトリ内のファイル数を取得する方法はありますか(Delphi 2010を使用しているWindowsの場合)ですか?ディレクトリ内のファイル数を効率的に取得するにはどうすればよいですか?

ファイルシステムのインデックス作成中にプログレスバーを実装したいと考えています。そのため、ディレクトリにいくつのファイルがあるのか​​を知る必要があります。

ディレクトリ内のファイル数を取得する最も簡単な方法は何ですか?

答えて

8

私は最速の方法はIOutils.pasにあるTDirectory.GetFilesメソッドを使うことだと思います。ディレクトリ内の(見える)ファイルの数はユーザーごとに異なる可能性があるため、何とか検索するための番号があるという小さな可能性しかありません。

FindFirst/FindNextアプローチ(上記の方法でラップされています)は実際にはファイルをトラバースしません。テーブル内のエントリを通過するだけなので、予想より速くなる可能性があります。

10

Windows 7またはServer 2008 R2で実行している場合は、SysUtilsからFindFirst関数とFindMatchingFile関数を抽出し、FindFirstFileの代わりにFindFirstFileExを使用するようにハッキングすることをお勧めします。その後、追加のflagsパラメータを2(MSDNでFIND_FIRST_EX_LARGE_FETCHと定義)に設定し、この設定は(Win32majorversion = 6)と(Win32minorversion> = 1)にします。

この設定では、これらのOSでFindFirst/FindNextループの速度が非常に高くなります。最新のドキュメントはDelphiのヘルプで検索されたMicrosoftドキュメントには記載されていないため、MSDNのFindFirstFileExを参照してください。

TDirectory.GetFilesは、最終的にはFindFirstを呼び出すように見えるので、自分のコードを単純化する以外に多くの利点を購入することはありません。

+2

+1興味深い! – jpfollenius

+0

また、FindExInfoBasicの情報レベルを使用して、古いショートファイル名の取得を無効にすることもできます –

関連する問題