在一个大文件夹(约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的网络往返较少。 无论使用与否,取决于您需要多少信息以及每个文件的延迟。