在大文件夹(约300,000个对象)上,FindNextFile最多可能需要20秒才能响应一个文件。我假设在后台进行了一些批量操作,但是这使操作很难取消。

有没有一种方法可以以异步方式运行FindNextFile,以便在不再需要该信息时可以将其取消?

Win7,x64,NTFS。

旁注:Windows缓存信息后,FindNextFile似乎没有此问题。它只是在第一次尝试枚举大文件夹中的文件时。

最佳答案

不,FindNextFile是同步的,没有可比的异步函数。解决此类问题的常用方法是多线程。您需要两个线程:应始终保持对用户响应的UI线程,以及执行FindNextFile调用的工作线程。我将使用带有锁定机制的队列。逻辑看起来像这样:

工作线程:

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

UI线程:
while (!UserCanceled() && !AllFilesDone())
{
    LockQueue();
    GetFileFromQueue();
    UnlockQueue();
    ProcessFile();
}

08-28 02:24