我正在为Windows编写一个服务(从XP到8.1)。 我需要以递归方式删除文件夹,然后使用DeleteFile
和RemoveDirectory
。 我不想使用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
,则要么操作失败,因为文件夹显然还没有准备好被删除,要么继续尝试直到它最终成功,定期枚举文件(如果创建了新文件)。
需要了解更多c/c++开发分享删除文件而不是将其标记为删除,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享删除文件而不是将其标记为删除相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979416.html