c++怎么在Windows系统中获取当前锁定的文件具体是由哪个进程占用【进阶】

大强大大_9812

大强大大_9812

2026-03-24

540人浏览

原创

GetFileInformationByHandle 无法直接判断谁锁定了文件,仅能通过 CreateFile 失败时的 ERROR_SHARING_VIOLATION 确认存在共享冲突;真正定位占用进程需用 Restart Manager API(RmStartSession→RmRegisterResources→RmGetList),但须确保路径绝对、大小写精确、避开重定向与临时文件干扰。

c++怎么在windows系统中获取当前锁定的文件具体是由哪个进程占用【进阶】

怎么用 GetFileInformationByHandle 判断文件是否被锁定

Windows 下没有直接返回“谁锁了这个文件”的 API,GetFileInformationByHandle 本身不提供进程信息,但它能帮你确认「当前句柄是否独占打开」——这是判断锁定的前提。如果调用它成功,说明你拿到了有效句柄;如果失败且 GetLastError() 返回 ERROR_SHARING_VIOLATION,基本可断定文件正被其他进程以不兼容的共享模式打开(比如别人用 FILE_SHARE_NONE 打开了)。

常见错误现象:CreateFile 失败但只查 ERROR_ACCESS_DENIED,漏掉 ERROR_SHARING_VIOLATION ——后者才是文件被占用的典型信号。

  • 必须用 GENERIC_READ 或 GENERIC_WRITE + 不带 FILE_SHARE_WRITE/FILE_SHARE_READ 的方式尝试打开,否则即使被占也会成功(共享模式掩盖了冲突)
  • 不要依赖 GetLastError() 的值在任意 API 调用后直接读取,必须在目标 API(如 CreateFile)返回 INVALID_HANDLE_VALUE 后立刻调用
  • GetFileInformationByHandle 不能告诉你哪个进程在用,它只是帮你验证:你自己的打开是否因共享冲突而失败

如何用 RestartManager API 查出占用进程 PID

真正能定位到进程的方案是 Windows Restart Manager(从 Vista 起内置),它专为“找出谁在用某文件”设计,比暴力枚举句柄靠谱得多,且无需管理员权限(部分场景除外)。

使用场景:你要删除/替换一个正在被 Excel、Notepad++ 或某个服务占用的 DLL/LOG 文件,需要提前通知用户或强制释放。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 调用顺序固定:RmStartSession → RmRegisterResources(传入文件路径数组)→ RmGetList(关键!返回占用该文件的 RM_UNIQUE_PROCESS 数组,含 PID 和进程名)
  • RmGetList 返回的进程名可能为空(比如 svchost 托管的服务),此时得靠 PID 配合 OpenProcess + QueryFullProcessImageName 补全路径
  • 注意 RmRegisterResources 接收的是 LPCWSTR,路径必须是绝对路径,相对路径或短文件名(8.3)会导致注册失败,RmGetList 返回空结果
  • 某些反病毒软件或受保护进程(如 CSRSS)可能拒绝被 Restart Manager 枚举,这不是 bug,是系统限制

为什么不用 NtQuerySystemInformation 枚举句柄

网上很多教程教用 NtQuerySystemInformation + SystemHandleInformation 遍历全系统句柄,再用 NtQueryObject 检查每个句柄是否指向目标文件。理论上可行,但实际极难落地:

  • 必须以管理员权限运行,普通用户调用直接 STATUS_ACCESS_DENIED
  • 返回的句柄信息里没有文件路径,只有对象名(如 DeviceHarddiskVolume1 oo.txt),需手动解析设备映射,遇到卷挂载点、符号链接、重定向(如 WSL2)极易匹配失败
  • 性能极差:一次遍历动辄上万句柄,NtQueryObject 是内核态调用,频繁触发上下文切换,卡顿明显
  • Windows 10 1809+ 对非微软签名驱动/进程隐藏部分句柄,导致漏报,且该 API 无正式文档支持,随时可能被废弃

实战中容易忽略的路径与权限细节

哪怕用了 Restart Manager,照样会失败——问题往往不出在逻辑,而在路径和权限的毛刺上。

  • 传给 RmRegisterResources 的路径必须和实际被占用的路径完全一致:比如进程打开的是 C:Temp ile.log,你传 C: empFILE.LOG(大小写/斜杠方向不同)或 \?C:Temp ile.log(NT 对象路径格式)都会匹配不上
  • 如果文件在 OneDrive 或 Dropbox 同步目录下,可能被其进程以“重定向”方式打开,Restart Manager 可能只报出云客户端 PID,而非最终使用者(如 Word)
  • 调用前先用 GetFinalPathNameByHandle 获取目标文件的真实路径(绕过符号链接),再传给 Restart Manager,能显著提升命中率
  • 某些程序(如 Visual Studio)会先创建临时文件再原子替换,你以为锁的是 config.json,其实当时被占的是 config.json.tmp ——得结合日志或 Process Monitor 确认真实操作对象

真正卡住人的,从来不是 API 调用几行代码,而是路径大小写、符号链接展开、同步工具劫持、临时文件命名这些藏在表层之下的细节。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2335

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3842

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1276

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4459

7

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3479

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

3038

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1548

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2739

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3370

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习