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

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

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

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

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

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

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

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

从服务中调用SHFileOperation是错误的吗?

从服务中调用SHFileOperation是错误的吗? 修订

所以你决定从服务中调用SHFileOperation,至少记得禁用复制挂钩

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

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