如何检查文件与文件夹是否可移动且未被外部进程锁定?
文件/文件夹移动前的锁定检查最佳方案
一、别用LockFile,直接尝试独占打开才是正解
LockFile和LockFileEx是给你自己打开的文件加锁用的,不是用来检测外部进程是否锁定了文件。正确的检测姿势是:调用CreateFile函数,以完全独占的方式打开目标文件:
- 参数设置:权限选
GENERIC_READ | GENERIC_WRITE,共享模式设为0(拒绝任何读写共享),创建方式用OPEN_EXISTING - 如果返回
INVALID_HANDLE_VALUE,再查GetLastError():- 要是返回
ERROR_SHARING_VIOLATION,那肯定是文件被其他进程占用或锁定了 - 要是
ERROR_ACCESS_DENIED,大概率是权限问题,不是锁定导致的
- 要是返回
二、LockFile返回False≠文件被外部锁定
LockFile的前提是你已经以可写权限打开了文件,它的作用是在你已打开的文件区域上加锁。返回False的原因有很多:
- 你打开文件时只给了只读权限,没法加锁
- 文件的目标区域已经被你自己的其他线程锁定了
- 当然也可能是外部进程锁了这块区域,但这只是其中一种可能,不能直接下定论
三、文件夹占用怎么查?
文件夹没有专门的检测API,只能用间接方法:
- 试着在目标文件夹里创建一个临时文件,然后删掉。如果创建失败且错误码是
ERROR_SHARING_VIOLATION,说明文件夹被占用(比如有进程在读里面的文件,或者资源管理器正开着这个文件夹预览) - 或者直接尝试重命名文件夹,重命名失败且错误码是
ERROR_SHARING_VIOLATION,也能说明被占用
四、关键提醒:检查只是辅助,直接移动更靠谱
不管你检查得多仔细,检查完到执行移动的间隙,都有可能被其他进程抢着锁定文件。所以最稳妥的做法是直接尝试移动操作,如果失败再根据错误码处理(比如提示用户关掉占用的程序)——提前检查最多是给用户提前预警,没法保证100%能移动成功。另外,正在运行的程序文件(比如exe、dll)系统会直接禁止移动,此时打开或移动都会返回共享冲突类的错误。
内容的提问来源于stack exchange,提问作者DmitryB
相关产品推荐
相关产品推荐

