一、背景
如果应用程序有操作本地文件的功能(如:读、写、复制、移动、删除等等),那么在测试或调试该应用程序时,肯定需要测试文件被其他应用程序锁定时,你的应用程序是如何处理的。
那么如何在本地模拟文件被锁定的场景,以便测试你的应用程序呢?
这篇文章将总结几种方法来模拟文件被锁定的场景。
二、方案
1. 使用notepad
应用程序
在批处理脚本或者cmd命令行窗口,使用如下命令:
bash
notepad >> filetolock
- 通过该方式锁定的文件:
可读、可复制等;不可移动/删除/重命名/执行等操作 (可执行文件将不可执行,如 .bat)- 关闭
notepad
窗口即可释放锁
2. 使用pause
、ping
、timeout
等命令
可以使用延时命令来定时锁定文件,使用方式如下:
1)pause
命令
bash
( >&2 pause ) >> filetolock
命令行窗口会显示"请按任意键继续. . .",当按任意键后,即可释放锁定的文件
2)ping
命令
bash
( >&2 ping -n 10 127.0.0.1 ) >> filetolock
ping
命令执行完,自动释放锁定的文件
3)timeout
命令
bash
( >&2 timeout /T 10 /nobreak ) >> filetolock
timeout
命令执行完,自动释放锁定的文件
- 上述方式锁定的文件,可读、可复制;不可写、不可执行、不可移动或删除;
>&2
是将命令输出重定向到handle 2(即标准错误),控制台仍显示命令输出。如果去掉>&2
,则命令输出会追加到filetolock
- 其他有延时效果的命令,也可实现锁定文件,如
set /p
、choice
、sleep
(需要安装)等,读者自行尝试
3. 使用more
命令
在dos窗口,使用more
命令,也可实现对文件的锁定
bash
more filetolock
- 需要注意的是,待锁定的文件如果内容较少不满足分屏显示的条件时,该方法无效(可以通过增加文件内容或者调整dos窗口的大小来改变每屏显示内容大小)
- 该方式锁定的文件,可读、可复制;不可写、不可执行、不可移动或删除;
4. 使用word
、excel
应用程序
使用操作系统自带的办公软件word
、excel
,打开待锁定文件即可将文件锁定
- 仅支持文本文件
- 该方式锁定的文件,可读、可复制;不可写、不可执行、不可移动或删除;
5. 使用icacls
命令
icacls
命令可通过访问控制列表(ACL)对指定的文件或目录进行权限控制,详细介绍请参考icacls /?
,示例:
bash
icacls "filename" /deny "username":(W,R,D)
icacls "filename" /remove:d "username"
filename
是要控制的文件名,username
是针对哪个用户进行访问控制,(W,R,D)
是权限掩码,分别是"写入(W)","读取(R)","删除(D)";/deny
表示显式拒绝指定的用户访问权限,/remove:d
将删除拒绝该SID的所有权限;
6. 使用file.open
方法
在Windows PowerShell
中,使用file.open
方法实现锁定文件
格式:Open(String, FileMode, FileAccess, FileShare)
示例:
bash
[System.io.File]::Open('F:\test\testfile.log', 'Open', 'Write', 'None')
打开指定文件,FlieMode
=Open
打开现有文件,FileAccess
=Write
对文件进行写访问,FileShare
=None
谢绝共享当前文件,详情参考:File.Open 方法
- 该方式锁定的文件,不可读/写/执行/移动/删除;
- 示例中的
FileAccess
=Write
,无论设置为Write
、Read
还是ReadWrite
,对于其它要访问锁定文件的程序而言,都是不可读/写/执行/移动/删除的;- 关闭
PowerShell
窗口,即可释放文件锁
7. 使用LockFileEx
方法
使用Windows API
中的LockFileEx
方法,以下是用Python语言调用第三方库win32file
实现
python
import win32con
import win32file
import pywintypes
p = "yourfile.txt"
f = file(p, "w")
hfile = win32file._get_osfhandle(f.fileno())
flags = win32con.LOCKFILE_EXCLUSIVE_LOCK | win32con.LOCKFILE_FAIL_IMMEDIATELY
win32file.LockFileEx(hfile, flags, 0, 0xffff0000, pywintypes.OVERLAPPED())
关于LockFileEx
方法,可参考:lockFileEx 函数
8. 使用第三方工具,如 filelocker
有一些第三方文件锁定工具可以在Windows上阻止其他程序删除或读写文件,如:filelocker
下载 FileLocker.zip 包,解压后使用FileLocker.exe
来锁定文件(你可以将其放到path
环境变量下的某个路径下,以便全局使用)
使用方法:
FileLocker [/T LockTime] [/I] [/K] [/Q] file [file...]
参数 | 说明 |
---|---|
/T LockTime |
按指定时间锁定文件,单位毫秒 |
/I |
无限锁定,直到进程被终止(默认) |
/K |
锁定文件,直到按下键 |
/Q |
静默模式,无输出信息,Ctrl+C 退出或关闭dos窗口 |
注意:需要管理员权限来执行 filelocker 命令,否则会报错【Errorcode 5: 拒绝访问】
- 该方式锁定的文件,不可读/写/执行/移动/删除;
总结
- 以上方法各有优缺点,自行体会;
- 方法还有很多,欢迎评论区补充;
- 以上方法在Win10测试可行,其他版本系统未测试,自行测试;
- 如果你需要手动释放未知程序锁定的文件,你可以:
a. 打开任务管理器
>性能
>资源监视器
>CPU
>关联的句柄
;
b. 在关联的句柄
搜索句柄,搜索被锁定的文件,在搜索结果进程右键选择终止进程
,即可释放锁定的文件。
参考资料
How to purposefully exclusively lock a file?
How can I simulate a "locked" file (one which has a write lock)
How-to: Redirection
File.Open 方法
FileLocker - a small tool to lock files