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