很多时候在删除某本地文件夹时老是会弹出一个比较恼人的提示:
文件夹正在使用
操作无法完成, 因为其中的文件夹或文件已在另一程序中打开
请关闭该文件夹或文件, 然后重试。
但是最近写的一个 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 限定的方案也可以, 谢谢 !