2

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

有没有办法以异步模式运行 FindNextFile 以便在不再需要信息时取消它?

Win7、x64、NTFS。

旁注:一旦信息被 Windows FindNextFile 缓存,似乎就没有这个问题了。它只是第一次尝试枚举大文件夹中的文件。

4

2 回答 2

2

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

工作线程:

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

用户界面线程:

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

如果您只需要访问几个文件,IShellFolder::EnumObjects 是一个更快的查询,但在网络上速度较慢,因为 FindNextFile 的批处理 io 的网络往返次数较少。是否使用它取决于您需要多少信息,以及每个文件的延迟。

于 2012-08-16T02:34:54.090 回答