FindFirstFile返回访问被拒绝

8

我正在尝试创建一个强大的递归文件夹删除函数。

对于普通目录来说,它的工作非常好。

问题出现在我创建了一个“超级硬核”的目录时:

C:\test\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\ ... \x\x\x

这个目录的长度约为25000(小于MSDN限制:32,767)。基本上我是递归地创建此目录,直到CreatDirectory函数失败。

现在,最奇怪的事情是,我的函数能够删除2个目录,然后FindFirstFile就会在0x5的错误下失败:

\\?\C:\test\x\ ... \x\x\x\*.*    < no error
\\?\C:\test\x\ ... \x\x\*.*      < no error
\\?\C:\test\x\ ... \x\*.*        < access denied

我可以重新运行it,app会很慢地渐渐占用文件夹,一次两个,可能直到路径长度变得相当小为止。

我正在运行FindFirstFile来检查文件夹是否为空。

  • 是否存在一些较少记录的限制?
  • FindFirstFile是否根本不起作用?(有bug吗?)
  • 我是否遗漏了某种NTFS权限的东西?
  • 其他什么……

编辑: 重要提示:如果我慢慢地逐步运行程序......那么就不会出现任何故障。


1
请展示您的精简代码。 - Peter Miehle
代码很大,我觉得没有必要发布。 - lerosQ
我已经做了这件事很多次,从未遇到过问题;问题很可能在你的代码中。至少试着将其简化为最小示例,看看是否有明显的问题。 - Luke
我在请求一些我不知道的奇怪东西,这让事情变得混乱。根据您的评论,没有这样的东西,所以我必须修复我的代码。 - lerosQ
1个回答

8
你可能遇到的是病毒扫描器、索引器或持续备份解决方案占用了该目录的句柄。例如,如果索引服务配置为对该文件夹进行索引,则会出现这种情况。
如果使用 FILE_SHARE_DELETE 标志以外的方式打开时,尝试删除已经打开的文件夹或文件将导致 ACCESS_DENIED。
要确认这一点,请使用 Process Monitor 查看与您路径匹配的任何内容的打开和关闭操作。
当然,还要确认您已调用了 FindClose。

索引服务一直在查询最深的文件夹... - lerosQ
我的问题是我尝试访问的文件的访问权限设置错误。这似乎是一个很明显的解决方案,但我建议检查文件属性->安全性,并确保正确的访问组可以访问文件,因为这是最明显的“拒绝访问”情况...你无法访问文件 =P - mgrandi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接