使用FindFirstFile-FindNextFile中的这个技巧加快文件搜索速度?

时间:2016-10-12 21:34:18

标签: winapi

我想知道FindFirstFile和下面的第一个FindNextFile。 这是真的,FindFirstFile总是找到'。' (当前文件夹)和以下FindNextFile总是' ..' (父文件夹)?面具当然是' *'。我想要一个加速文件列表,我可以写一些东西,比如:

h := FindFirstFile('path\*' ...)     // it finds '.', not process
if h = INVALID_HANDLE_VALUE then ... // some error handling, of course
FindNextFile(...)                    // skipping '..', I suppose, if '.' has found,
                                     // '..' will be too, no handle validity check
while FindNextFile(...) do
  // file/folder processing begins here

所以我不需要检查'。'和' ..'每个周期中的文件名。对不起语法,我想,我是可以理解的,而对于我的英语,如果我犯了错误。

2 个答案:

答案 0 :(得分:1)

完全不能保证前两个条目为'. ''..'。因此,您的建议代码无法使用。

我想,你可以用一个布尔值来表示你是否看过这两个条目,如果是这样的话,请跳过检查。

但是,检查这些值不是您的瓶颈。枚举目录涉及到磁盘和系统调用的访问。这是瓶颈。任何优化对这些项目进行检查的尝试都会使代码混淆,并且不会产生明显的性能优势。

答案 1 :(得分:0)

感谢您的回答。我的兴趣之一是找到最佳解决方案,简短基本代码中的算法(如果需要,直到汇编级别)。在我的实践中,它似乎是真的,我经历过。但我没想到会找到任何关于它的文档,这取决于Find * File的内部行为和harddrive的数据结构。 这就是我问的原因。再次感谢。

Jonathan:我真的使用FindFirstFileEx和FIND_FIRST_EX_LARGE_FETCH,不像示例代码:)我认为使用Ex或不使用与问题无关。

IInspectable:你是对的,我不想陷入MFT:)

我不会使用这种形式的代码。我将使用 - 正如大卫建议的那样 - 一个变量,但是一个整数类型来计算从2开始的事件,如果计数器达到0,则不再需要名称检查。