c/c++语言开发共享删除文件而不是将其标记为删除

我正在为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 ,则要么操作失败,因为文件夹显然还没有准备好被删除,要么继续尝试直到它最终成功,定期枚举文件(如果创建了新文件)。

    需要了解更多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

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐