4

(WinAPIとC ++を使用して)フォルダー内のサブフォルダーへのすべてのパスを取得する必要があります。これまでのところ、FindFirstFile / FindNextFileを再帰的に呼び出すことが唯一の解決策でしたが、より深い階層のフォルダーでこれを行うにはかなりの時間がかかります。 。

だから私は、フォルダ名を取得するためだけに、より速いアプローチがあるのだろうかと思っていました。

4

3 に答える 3

4

本当にサブフォルダが必要な場合は、検索オプションFindFirstFileExを使用し て非ディレクトリを除外できるはずです。

ドキュメントでは、これはアドバイザリフラグのみであると示唆されていますが、ファイルシステムがこの最適化をサポートしている可能性があります。試してみてください。

FindExSearchLimitToDirectories

これは勧告フラグです。ファイルシステムがディレクトリフィルタリングをサポートしている場合、関数は指定された名前に一致し、ディレクトリでもあるファイルを検索します。ファイルシステムがディレクトリフィルタリングをサポートしていない場合、このフラグは黙って無視されます。

于 2013-03-12T11:51:24.840 に答える
3

より迅速なアプローチは、API をバイパスFindFirstFile...()してファイル システムに直接アクセスすることです。コントロールと共に使用DeviceIoControl()して、FSCTL_ENUM_USN_DATA少なくとも NTFS フォーマットのボリュームで、マスター ファイル テーブルにアクセスできます。その情報を使用して、属性、親情報などを含むファイル/フォルダーのレコードに直接アクセスできます。はい、それはより多くの作業になりますが、コードを最適化して断片だけにアクセスできるため、高速になるはずです。あなたが必要です。

于 2013-03-12T23:17:32.233 に答える
2

それがあなたが遭遇できる最速のアプローチです。また、時間がかかるため、別のスレッドを使用してディレクトリの列挙を管理することを検討することもできます。ディレクトリに多くのサブフォルダー/ファイルがある場合、Microsoftファイルエクスプローラーでさえ時間がかかります。

ここでのもう 1 つのことは、ディレクトリを一度列挙してから、更新を登録できることです。そのため、フォルダーを列挙するコストは、起動時に 1 回だけ実行する必要があります。

于 2013-03-12T00:46:07.067 に答える