反正是否有异步FindNextFile?

时间:2012-08-15 19:21:30

标签: windows winapi file-io ntfs

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

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

Win7,x64,NTFS。

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

2 个答案:

答案 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具有较少的网络往返。是否使用它取决于您需要多少信息以及每个文件的延迟。