在一个大文件夹(约 300,000 个对象)上,FindNextFile 最多可能需要 20 秒才能响应一个文件。我假设后台正在进行一些批量操作,但这使得操作很难取消。
有没有办法以异步模式运行 FindNextFile 以便在不再需要信息时取消它?
Win7、x64、NTFS。
旁注:一旦信息被 Windows FindNextFile 缓存,似乎就没有这个问题了。它只是第一次尝试枚举大文件夹中的文件。
不,FindNextFile 是同步的,没有可比的异步函数。此类问题的通常解决方案是多线程。您需要两个线程:一个始终响应用户的 UI 线程和一个执行 FindNextFile 调用的工作线程。我会使用带有锁定机制的队列。逻辑看起来像这样:
工作线程:
FindFirstFile();
do
{
LockQueue();
AddFileToQueue();
UnlockQueue();
while (FindNextFile() && !UserCanceled());
SetAllFilesDone();
用户界面线程:
while (!UserCanceled() && !AllFilesDone())
{
LockQueue();
GetFileFromQueue();
UnlockQueue();
ProcessFile();
}
如果您只需要访问几个文件,IShellFolder::EnumObjects 是一个更快的查询,但在网络上速度较慢,因为 FindNextFile 的批处理 io 的网络往返次数较少。是否使用它取决于您需要多少信息,以及每个文件的延迟。