在大文件夹(约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();
}