2

大きなフォルダー(最大300,000オブジェクト)では、FindNextFileが1つのファイルで応答するのに最大20秒かかる場合があります。バックグラウンドで一括操作が行われていると思いますが、キャンセルが非常に難しくなります。

FindNextFileを非同期モードで実行して、情報が不要になった場合にキャンセルできるようにする方法はありますか?

Win7、x64、NTFS。

補足:情報がWindowsによってキャッシュされると、FindNextFileにこの問題は発生しないようです。大きなフォルダ内のファイルを列挙しようとするのは初めてです。

4

2 に答える 2

2

いいえ、FindNextFileは同期であり、同等の非同期関数はありません。この種の問題に対する通常の解決策はマルチスレッドです。2つのスレッドが必要です。常にユーザーに応答し続ける必要があるUIスレッドと、FindNextFile呼び出しを実行するワーカースレッドです。ロックメカニズムを備えたキューを使用します。ロジックは次のようになります。

ワーカースレッド:

FindFirstFile();
do
{
    LockQueue();
    AddFileToQueue();
    UnlockQueue();
 while (FindNextFile() && !UserCanceled());
 SetAllFilesDone();

UIスレッド:

while (!UserCanceled() && !AllFilesDone())
{
    LockQueue();
    GetFileFromQueue();
    UnlockQueue();
    ProcessFile();
}
于 2012-08-15T20:18:59.787 に答える
1

IShellFolder :: EnumObjectsは、いくつかのファイルにアクセスする必要がある場合は高速なクエリですが、FindNextFileのバッチioのネットワークラウンドトリップが少ないため、ネットワーク上では低速です。使用するかどうかは、必要な情報の量と各ファイルの待機時間によって異なります。

于 2012-08-16T02:34:54.090 に答える