【发布时间】:2015-08-12 09:18:51
【问题描述】:
我正在为 Windows(从 XP 到 8.1)编写服务。我需要递归删除一个文件夹,为此我使用DeleteFile 和RemoveDirectory。
我不想使用SHFileOperation,因为它有MAX_PATH 的限制。
问题在于,有时RemoveDirectory 会以ERROR_DIR_NOT_EMPTY 失败,即使目录为空。
我发现这是因为DeleteFile 是异步工作的,它只会“标记”要删除的文件。因此,在调用RemoveDirectory 之前添加一个小延迟(睡眠)可以解决此问题。但我正在寻找一种更清洁的方法。
那么,有没有办法确保标记的文件被完好无损地删除?
我已经尝试直接在目录上调用FlushFileBuffers,但没有成功。
编辑:有些人声称NtDeleteFile 可以删除文件,即使文件上打开了句柄。我刚刚检查过它是错误的,至少在 Windows 8.1 上是错误的:只有当所有句柄都关闭时才会删除文件。
【问题讨论】:
-
...the file deletion does not occur until the last handle to the file is closed看起来有人正在使用 FILE_SHARE_DELETE 打开文件,而您添加的睡眠恰好在最后一个 CloseHandle 之后移动了 RemoveDirectory 调用。你能识别开瓶器并确定它是否在你的控制之下吗?如果是,您必须使其与删除过程配合。不知道,您将如何防止不相关的进程通过保持打开的文件来拒绝您删除目录:S -
唯一现实的解决方案是在短暂延迟后重试。您可能会发现几毫秒就足够了。