2011-01-12 4 views
3

Windowsオペレーティングシステムでは、サードパーティのライブラリやFindFirstFile、FindNextFileなどを使用せずに、特定のディレクトリ内のファイルをどのように反復処理しますか?FindFirstFileを使用せずにディレクトリ内のファイルを反復する

+2

でこのサンプルコードは、FindFirstFileと間違って何ですか? –

+1

エクスプローラウィンドウのスクリーンショットを作成し、それをOCRしますか? Win32では、正確に同じジョブを実行するための2つの方法が日常的には提供されていません。 –

+0

理由を説明してください。 – peterchen

答えて

3

FindFirstFileがWindowsの主なファイル列挙方法であるとすれば、他に何が得られますか? FindFirstFileによって呼び出されるNT API関数(ZwQueryDirectoryFileなど)がありますが、これらはより複雑であり、本当のメリットはありません。

+0

本当のメリットはありませんか?初心者はAPCを使うことができますが、ネイティブ関数は渡されたバッファに収まる数のエントリを返すことができます( 'ReturnSingleEntry'が' FALSE'であると仮定します)。これにより、関数呼び出しが少なくなり、一般的にははるかに高速になるはずです。しかし、おそらくMFT解析を使用した場合と同じくらい速くはありません。 – 0xC0000022L

+0

@ 0xc0000022l番号がありますか?ディレクトリスキャンを最適化しようとする人が数人いることがわかりましたが、結果はそれほど有望ではありませんでした。しかし、これはOS特有のものかもしれません。 ZwQueryDirectoryFileはそれほど高速ではないようでした(複数のエントリに対して1つの呼び出しを使用することについてのあなたの意見を理解しています)。もちろん、FATやMFTの直接構文解析は違いになります。 –

+0

問題は、この方法がネットワークドライブにとって遅すぎるということです。私の場合、10〜20分以上かかることがあります。しかし、Windowsエクスプローラで同じディレクトリに移動するとうまく動作します。 – maamaa

0

管理コードを使用できる場合は、Directory.EnumerateFilesを使用するとプログラミングが簡単になります。

指定されたパスにファイル名 の列挙可能なコレクションを返します。

0

ディレクトリ内のファイルを一覧表示するには、Windows Scriptingライブラリの一部であるScripting.FileSystemObjectオブジェクトを使用してください。このオブジェクトをC++、delphi、またはCOMへのアクセスをサポートする言語で使用できます。

チェック好奇心のうち、VBScriptの

Set objFSO = CreateObject("Scripting.FileSystemObject") 
objStartFolder = "C:\test" 
Set objFolder = objFSO.GetFolder(objStartFolder) 
Set colFiles = objFolder.Files 
For Each objFile in colFiles 
    Wscript.Echo objFile.Name 
Next 
関連する問題