有没有办法做一个asynchronous的FindNextFile?

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

有没有办法在asynchronous模式下运行FindNextFile,以便它可以被取消,如果信息不再需要?

Win7,x64,NTFS。

注意:一旦信息被Windowscaching了,FindNextFile就不会出现这个问题。 它只是第一次尝试枚举大文件夹中的文件。

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

工作者主题:

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

UI主题:

 while (!UserCanceled() && !AllFilesDone()) { LockQueue(); GetFileFromQueue(); UnlockQueue(); ProcessFile(); } 

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