删除文件而不是将其标记为删除

时间:2015-05-29 13:20:49

标签: c++ c file winapi

我正在为Windows编写服务(从XP到8.1)。我需要以递归方式删除文件夹,然后使用DeleteFileRemoveDirectory。 我不想使用SHFileOperation,因为它有MAX_PATH限制。

问题在于,即使目录为空,RemoveDirectory也会失败并显示ERROR_DIR_NOT_EMPTY。 我发现这是因为DeleteFile异步工作,它只是"标记"要删除的文件。因此,在调用RemoveDirectory之前添加一个小延迟(睡眠)可以解决问题。但我正在寻找一种更清洁的方法。

那么,有没有办法确保标记的文件被完全删除?

我已经尝试直接在目录上调用FlushFileBuffers,但没有成功。

编辑:有人声称NtDeleteFile可以删除文件,即使文件上有句柄打开也是如此。我刚刚检查过它,这是错误的,至少在Windows 8.1上:只有当所有句柄都关闭时才会删除文件。

1 个答案:

答案 0 :(得分:0)

  

我不想使用SHFileOperation,因为它有MAX_PATH限制。

在Vista +上,您可以(并且应该)使用IFileOperation代替SHFileOperation()。然后,您不限于任何路径长度限制,并且可以在服务中安全使用,与SHFileOperation()不同:

Is it wrong to call SHFileOperation from a service?

Is it wrong to call SHFileOperation from a service? Revised

So you decided to call SHFileOperation from a service, at least remember to disable copy hooks

  

那么,有没有办法确保标记的文件被完全删除?

不是真的。文件正在使用中,或者不从高速缓存管理器等清除。 If DeleteFile()成功,您知道文件将被删除最终。您只需要给系统时间实际删除它。如果您收到ERROR_DIR_NOT_EMPTY,请等待几秒钟再试一次。如果在多次尝试后继续获得ERROR_DIR_NOT_EMPTY,则要么操作失败,因为文件夹显然还没有准备好被删除,要么继续尝试直到它最终成功,定期枚举文件(如果创建了新文件)