很多时候在删除某本地文件夹时老是会弹出一个比较恼人的提示:
文件夹正在使用
操作无法完成, 因为其中的文件夹或文件已在另一程序中打开
请关闭该文件夹或文件, 然后重试。
但是最近写的一个 Qt 应用却需要这样一个功能: 在进行某些长时操作时应用会创建一些文件夹, 比如:
MainFolder
subfolder1
subfolder2
...
该长时操作过程中多个任务线程会不断往这些文件夹里写入大量文件, 写完一个文件即关闭. 为防止人为的误操作(大概率事件), 在写入数据的过程中禁止这些文件夹被移动或删除, 除非已经停止这个连续的写入过程, 虽然可以在写入的时候判断文件夹是否还在, 不在时提示或报错, 但是这种结果无法接受, 因为得到了不完整的数据. 于是想这样来保护这些文件夹:
lock(folders_on_writing) // 将无法移动或删除 folders_on_writing
long_run_writing();
unlock(folders_on_writing) // 可以移动或删除 folders_on_writing 了
我想了以下办法来实现lock
, unlock
, 但都不怎么好:
使用QFileSystemWatcher
来监听这些文件夹, lock
的时候监听, unlock
的时候停止监听. 这样在删除MainFolder
时会提示权限不够, 但是可以任意删除子文件夹, 当把子文件夹都删除后, 可以直接删除主文件夹. 因为只需要禁止文件夹被移动或删除, 强行使用监听功能有点过, 而且"权限不够"的提示也很微妙, 想要的提示是"正在被使用".
lock
时在各个文件夹中打开一个临时文件, unlock
时才关闭这些文件并删除. 目前用的这种简单的笨办法, 可以达到效果.
那么是否还有更好的办法? 比如可以获取到文件夹的句柄什么的就禁止了移动或删除, 之后释放掉句柄就变得可以移动或删除了, 如果有现成的 Qt 方案就更好了, windows 限定的方案也可以, 谢谢 !
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.