2016-10-12 8 views
3

私はFindFirstFileと次の最初のFindNextFileについて知りたいと思います。 FindFirstFileが常に '。' (現在のフォルダ)と次のFindNextFileは常に '..'(親フォルダ)ですか?もちろんマスクは「*」です。私は、ファイルのリストを少しスピードをアップしたい、私は同じように、何かを書くことができます:「」だから私はチェックの必要はありませんFindFirstFile-FindNextFileでこのトリックでファイル検索を高速化しますか?

h := FindFirstFile('path\*' ...)  // it finds '.', not process 
if h = INVALID_HANDLE_VALUE then ... // some error handling, of course 
FindNextFile(...)     // skipping '..', I suppose, if '.' has found, 
            // '..' will be too, no handle validity check 
while FindNextFile(...) do 
    // file/folder processing begins here 

と '..'のファイル名が毎回あります。文法には申し訳ありませんが、わたしは理解できました、そして私の英語のために、私が間違いを犯すならば。

+5

それは無意味であり、測定可能な方法でそれをスピードアップせず、単に難読化するだけです。注文を保証するものは何も見つかりません。要するに、これを行うことに賛成するとは言えないことはまったくありません。 –

+4

@DavidHeffernan "path"が "C:"の場合、2つの完全に良いディレクトリエントリを破棄しただけです。 –

+1

ディレクトリ内のファイルの列挙を高速化する唯一の本当の方法は、[MFT](https://en.wikipedia.org/wiki/NTFS#Internals)に直接アクセスすることです。しかし、物事はそこに複雑になる、私は気にしないだろう。 – IInspectable

答えて

1

最初の2つのエントリが'. ''..'になるという保証はありません。したがって、あなたの提案したコードは使用できません。

あなたは、これらの2つのエントリを見たかどうかを判断するためにトラックを保持することができます。

ただし、これらの値を確認することはボトルネックではありません。ディレクトリを列挙すると、ディスクへのトリップやシステムコールが含まれます。それがボトルネックです。これらの項目のチェックを最適化しようとすると、コードがわかりにくくなり、パフォーマンス上のメリットが得られません。

0

お返事ありがとうございます。私の趣味の1つは、最善のソリューション、短い必須コードのアルゴリズム(必要に応じて、アセンブリレベルまで)を見つけることです。私の練習では、それは本当のように見えました。しかし、それについてのドキュメントは見つかりませんでしたが、Find * Fileの内部動作とハードドライブのデータ構造に依存していると思いました。 これが私が尋ねた理由です。再度、感謝します。

Jonathan:FIND_FIRST_EX_LARGE_FETCHを使用して実際にFindFirstFileExを使用しましたが、サンプルコードのようではありませんでした。私はExを使用しているかどうかは問題には関係ありません。

IInspectable:そうだね、私はMFTに沈むする必要はありません:)

私は、コードのこのフォームを使用しないでしょう。私は - Davidが示唆しているように - 変数を使用しますが、整数型は2からカウントダウンまで減少し、カウンタが0になると名前検査はもう必要ありません。

+0

これ以上速くなく、あなたのコードは難読化されます –

+0

ボトルネック、私はAPI呼び出しとディスクアクセスのスピードアップができませんが、私はdisasemblerで単純な文字列を比較することに従いました。これは私を煩わす(難解)。してください、笑いや真剣に私を取る、それは趣味です。私は、ユニコードを比較するための特別なアセンブリコードを書くつもりです。と '..'。私はあまりにも最大限になるかもしれません:) – Rhoyd

+0

楽しいですが、あなたのプログラムがより速く実行されることは自分自身を育てないでください。 –

関連する問題