我正在为Windows编写服务(从XP到8.1)。我需要以递归方式删除文件夹,然后使用DeleteFile
和RemoveDirectory
。
我不想使用SHFileOperation
,因为它有MAX_PATH
限制。
问题在于,即使目录为空,RemoveDirectory
也会失败并显示ERROR_DIR_NOT_EMPTY
。
我发现这是因为DeleteFile
异步工作,它只是"标记"要删除的文件。因此,在调用RemoveDirectory
之前添加一个小延迟(睡眠)可以解决问题。但我正在寻找一种更清洁的方法。
那么,有没有办法确保标记的文件被完全删除?
我已经尝试直接在目录上调用FlushFileBuffers
,但没有成功。
编辑:有人声称NtDeleteFile
可以删除文件,即使文件上有句柄打开也是如此。我刚刚检查过它,这是错误的,至少在Windows 8.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
,则要么操作失败,因为文件夹显然还没有准备好被删除,要么继续尝试直到它最终成功,定期枚举文件(如果创建了新文件)