(WinAPIとC ++を使用して)フォルダー内のサブフォルダーへのすべてのパスを取得する必要があります。これまでのところ、FindFirstFile / FindNextFileを再帰的に呼び出すことが唯一の解決策でしたが、より深い階層のフォルダーでこれを行うにはかなりの時間がかかります。 。
だから私は、フォルダ名を取得するためだけに、より速いアプローチがあるのだろうかと思っていました。
(WinAPIとC ++を使用して)フォルダー内のサブフォルダーへのすべてのパスを取得する必要があります。これまでのところ、FindFirstFile / FindNextFileを再帰的に呼び出すことが唯一の解決策でしたが、より深い階層のフォルダーでこれを行うにはかなりの時間がかかります。 。
だから私は、フォルダ名を取得するためだけに、より速いアプローチがあるのだろうかと思っていました。
本当にサブフォルダが必要な場合は、検索オプションFindFirstFileEx
を使用し
て非ディレクトリを除外できるはずです。
ドキュメントでは、これはアドバイザリフラグのみであると示唆されていますが、ファイルシステムがこの最適化をサポートしている可能性があります。試してみてください。
FindExSearchLimitToDirectories
これは勧告フラグです。ファイルシステムがディレクトリフィルタリングをサポートしている場合、関数は指定された名前に一致し、ディレクトリでもあるファイルを検索します。ファイルシステムがディレクトリフィルタリングをサポートしていない場合、このフラグは黙って無視されます。
より迅速なアプローチは、API をバイパスFindFirstFile...()
してファイル システムに直接アクセスすることです。コントロールと共に使用DeviceIoControl()
して、FSCTL_ENUM_USN_DATA
少なくとも NTFS フォーマットのボリュームで、マスター ファイル テーブルにアクセスできます。その情報を使用して、属性、親情報などを含むファイル/フォルダーのレコードに直接アクセスできます。はい、それはより多くの作業になりますが、コードを最適化して断片だけにアクセスできるため、高速になるはずです。あなたが必要です。
それがあなたが遭遇できる最速のアプローチです。また、時間がかかるため、別のスレッドを使用してディレクトリの列挙を管理することを検討することもできます。ディレクトリに多くのサブフォルダー/ファイルがある場合、Microsoftファイルエクスプローラーでさえ時間がかかります。
ここでのもう 1 つのことは、ディレクトリを一度列挙してから、更新を登録できることです。そのため、フォルダーを列挙するコストは、起動時に 1 回だけ実行する必要があります。