讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

updream

一键生成高质量推广成片

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

大强大大_9812

大强大大_9812

发布时间:2026-03-24 19:59:02

|

540人浏览过

|

来源于php中文网

原创

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 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

立即学习“C++免费学习笔记(深入)”;

  • 调用顺序固定: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++

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

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

相关专题

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

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

2335

2023.08.07

json是什么
json是什么

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

3842

2023.08.23

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

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

1276

2023.10.13

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

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

4459

2025.09.10

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

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

3479

2023.07.26

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

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

3038

2023.07.27

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

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

1548

2023.08.01

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

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

2739

2023.08.02

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn