一、背景

如果应用程序有操作本地文件的功能(如:读、写、复制、移动、删除等等),那么在测试或调试该应用程序时,肯定需要测试文件被其他应用程序锁定时,你的应用程序是如何处理的。
那么如何在本地模拟文件被锁定的场景,以便测试你的应用程序呢?
这篇文章将总结几种方法来模拟文件被锁定的场景。

二、方案

1. 使用notepad应用程序

在批处理脚本或者cmd命令行窗口,使用如下命令:

notepad >> filetolock
  1. 通过该方式锁定的文件:
    可读、可复制等;不可移动/删除/重命名/执行等操作 (可执行文件将不可执行,如 .bat)
  2. 关闭notepad窗口即可释放锁

2. 使用pausepingtimeout等命令

可以使用延时命令来定时锁定文件,使用方式如下:
1)pause命令

( >&2 pause ) >> filetolock

命令行窗口会显示"请按任意键继续. . .",当按任意键后,即可释放锁定的文件
2)ping命令

( >&2 ping -n 10 127.0.0.1 ) >> filetolock

ping命令执行完,自动释放锁定的文件
3)timeout命令

( >&2 timeout /T 10 /nobreak ) >> filetolock

timeout命令执行完,自动释放锁定的文件

  1. 上述方式锁定的文件,可读、可复制;不可写、不可执行、不可移动或删除;
  2. >&2是将命令输出重定向到handle 2(即标准错误),控制台仍显示命令输出。如果去掉>&2,则命令输出会追加到 filetolock
  3. 其他有延时效果的命令,也可实现锁定文件,如set /pchoicesleep(需要安装)等,读者自行尝试

3. 使用more命令

在dos窗口,使用more命令,也可实现对文件的锁定

more filetolock
  1. 需要注意的是,待锁定的文件如果内容较少不满足分屏显示的条件时,该方法无效(可以通过增加文件内容或者调整dos窗口的大小来改变每屏显示内容大小)
  2. 该方式锁定的文件,可读、可复制;不可写、不可执行、不可移动或删除;

4. 使用wordexcel应用程序

使用操作系统自带的办公软件wordexcel,打开待锁定文件即可将文件锁定

  1. 仅支持文本文件
  2. 该方式锁定的文件,可读、可复制;不可写、不可执行、不可移动或删除;

5. 使用icacls命令

icacls命令可通过访问控制列表(ACL)对指定的文件或目录进行权限控制,详细介绍请参考icacls /?,示例:

icacls "filename" /deny "username":(W,R,D)
icacls "filename" /remove:d "username"
  1. filename是要控制的文件名,username是针对哪个用户进行访问控制,(W,R,D)是权限掩码,分别是"写入(W)",“读取(R)”,“删除(D)”;
  2. /deny 表示显式拒绝指定的用户访问权限,/remove:d 将删除拒绝该SID的所有权限;

6. 使用file.open方法

Windows PowerShell中,使用file.open方法实现锁定文件
格式:Open(String, FileMode, FileAccess, FileShare)
示例:

[System.io.File]::Open('F:\test\testfile.log', 'Open', 'Write', 'None')

打开指定文件,FlieMode=Open打开现有文件,FileAccess=Write对文件进行写访问,FileShare=None谢绝共享当前文件,详情参考:File.Open 方法

  1. 该方式锁定的文件,不可读/写/执行/移动/删除;
  2. 示例中的FileAccess=Write,无论设置为WriteRead还是ReadWrite,对于其它要访问锁定文件的程序而言,都是不可读/写/执行/移动/删除的;
  3. 关闭PowerShell窗口,即可释放文件锁

7. 使用LockFileEx方法

使用Windows API中的LockFileEx方法,以下是用Python语言调用第三方库win32file实现

import win32con
import win32file
import pywintypesp = "yourfile.txt"
f = file(p, "w")
hfile = win32file._get_osfhandle(f.fileno())
flags = win32con.LOCKFILE_EXCLUSIVE_LOCK | win32con.LOCKFILE_FAIL_IMMEDIATELYwin32file.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: 拒绝访问】

  1. 该方式锁定的文件,不可读/写/执行/移动/删除;

总结

  1. 以上方法各有优缺点,自行体会;
  2. 方法还有很多,欢迎评论区补充;
  3. 以上方法在Win10测试可行,其他版本系统未测试,自行测试;
  4. 如果你需要手动释放未知程序锁定的文件,你可以:
    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

Windows 如何锁定文件相关推荐

  1. 10.30 linux和windows互传文件,用户配置文件和密码配置文件,用户组管理,用户管理...

    2019独角兽企业重金招聘Python工程师标准>>> 2.27 linux和windows互传文件 putty不支持  xshell和securecrt支持 如果是centos系统 ...

  2. VMware虚拟机提示“锁定文件失败 打不开磁盘”解决方法

    有用户在打开VMware虚拟机时提示"锁定文件失败 打不开磁盘或它所依赖的某个快照磁盘.模块启动失败.未能启动虚拟机."遇到这个问题该怎么办呢?出现这个问题是由于虚拟机磁盘保护机制 ...

  3. 服务器锁定文件,BEA-141297 - 无法获取服务器文件锁定(BEA-141297 - Could not get the server file lock)...

    BEA-141297 - 无法获取服务器文件锁定(BEA-141297 - Could not get the server file lock) 尝试启动Oracle Weblogic Server ...

  4. Windows中常用文件拷贝工具的评测和对比 1

    对于Windows用户,拷贝文件是再常用不过的功能.打开文件浏览器(FileExplorer),把一个盘符的一个文件夹拖拽到另一个盘符下面是非常简单的操作.这样的文件拖拽操作在两端都是本地盘的情况下速 ...

  5. W ndowS无法自动修此计算机,系统引导怎么修复?电脑手动修复Windows系统引导文件...

    我们在使用Windows系统的时候,经常会遇到一些系统问题.有时候系统引导文件丢失,导致电脑完成正常启动,这种时候可以通过外置工具来修复引导.不过Windows系统中也有手动修复引导的工具.那么下面就 ...

  6. Access数据库:它已经被别的用户以独占方式打开,操作必须使用一个可更新的查询,不能锁定文件

    转自:http://iasp.bokee.com/  笔名:iasp 由于网络开发过程,或者一些下载的例子工程一般都用Access数据库,因为它方便不需要服务器,以文件方式就可以访问. Access数 ...

  7. linux下移动c盘文件位置,问个问题我在unbuntu下为何找不到windows c盘文件

    问个问题我在unbuntu下为何找不到windows c盘文件 发布时间:2008-08-08 08:07:13来源:红联作者:fzmhlxk 这是不是和重ghost安装过xp有关啊 是不是引导文件的 ...

  8. Ubuntu 之linux与windows互传文件

    Windows系统下与linux传输文件 windows环境下,windows传出数据到linux下 确保ubuntu安装了ssh服务端. 如果没有安装,使用以下命令安装: sudo aptget i ...

  9. path与classpath区别 path是Windows查找.exe文件的路径;classpath是jvm查找.class文件的路径

    CLASSPATH环境变量.作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPATH来寻找类的.class文件 总而言之,path是Windows查找.e ...

最新文章

  1. 海淀城市大脑建设单位“中海纪元”调研“智源研究院”
  2. Maven系列学习(二)Maven使用入门
  3. 如何在SAP Server Side JavaScript里消费destination
  4. oracle连接数一直超出,Oracle超出最大連接數問題及解決(…
  5. 如何在 C# 中使用 FTP 上传文件
  6. android手机拍摄权限,react-native 手机拍照权限
  7. eclipse 使用 maven 无法编译 jsp 文件的问题
  8. 先来先服务算法、运行时间最短者优先算法和最高响应比优先调度算法_Linux进程调度:完全公平调度器CFS
  9. 华为p40pro怎么用鸿蒙系统,华为p40pro鸿蒙系统正式版
  10. FineBI:一个简单易用的自助BI工具
  11. Unity 不使用BMFont创建Font字体
  12. 三调业务摘要201709
  13. 红蓝攻防比赛得哪些事
  14. Windows鼠标指针美化
  15. Erlang之ETS,DETS入门
  16. cubieboard mysql_Cubieboard开发笔记
  17. C++中函数返回引用
  18. 高级变量类型 ---- 字符串
  19. 花火之声不闻于耳 [线段树]
  20. Android 发布代码到github 并且部署到 JitPack maven 仓库详细步骤

热门文章

  1. 提高GitHub访问速度及其他DNS优化
  2. HTMLParser
  3. 使用反向代理规避备案风险
  4. Speex的移植和简单使用
  5. Labview绘制圆/椭圆
  6. java23中设计模式(1)-facade(门面,外观)模式
  7. matlab确定灰度阈值T,matlab灰度图像二值化【灰度图像二值化算法研究】
  8. leetcode1049. 最后一块石头的重量 II(java)
  9. Excel快捷键F1-F9详解:掌握实用快捷操作,提升工作效率
  10. ICML 2021 | 上交华为提出GWD:旋转目标检测新方法