讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何检测文件是否被占用 _ 尝试独占打开文件方法【干货】

风萱君_2184

风萱君_2184

发布时间:2026-04-08 21:51:34

|

364人浏览过

|

来源于php中文网

原创

fopen以"r+b"模式打开失败大概率说明文件正被占用;Windows下只要任意进程以非共享写方式打开文件,该调用即失败并返回nullptr,需结合errno判断EACCES或EBUSY。

c++如何检测文件是否被占用 _ 尝试独占打开文件方法【干货】

用 fopen 以 "r+b" 模式打开失败,大概率说明文件正被占用

Windows 下文件被其他进程以写入或独占方式打开时,fopen 尝试以读写模式("r+b")打开会直接返回 nullptr,这是最轻量、最常用的检测手段。注意不能用 "r" —— 只读模式在多数情况下仍能成功,哪怕文件正被记事本、Excel 等程序打开。

实操建议:

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

  • "r+b" 是关键:它要求操作系统授予读+写权限,而只要任意进程以 FILE_SHARE_WRITE 以外的方式打开该文件,此调用就会失败
  • 必须配合 errno 判断:失败后检查 errno == EACCES 或 errno == EBUSY(不同 CRT 实现略有差异),避免把路径不存在等错误误判为“被占用”
  • 不要依赖 GetLastError():C 运行时封装后,fopen 不保证更新 Windows 错误码,应优先信 errno

Windows API 的 CreateFile 更精确,但需手动处理共享标志

如果需要区分“被写打开”和“被读打开”,或者想控制超时/重试逻辑,CreateFile 是更底层也更可靠的选择。它的行为由 dwShareMode 参数决定,而不是靠猜测。

实操建议:

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

  • 想检测是否被**任何方式占用**:传 dwShareMode = 0(即不共享),此时只要文件上有任何句柄未关闭,就返回 INVALID_HANDLE_VALUE
  • 想检测是否被**写入占用**:传 dwShareMode = FILE_SHARE_READ,若失败说明有进程以写方式打开(如 Word 正在编辑)
  • 务必调用 CloseHandle():即使打开失败也要确保不泄漏句柄(虽然失败时返回值不是有效句柄,但成功后忘记关会导致资源累积)

Linux/macOS 下没有“文件占用”概念,open 默认总是成功

Unix-like 系统不阻止对已打开文件的再次打开,open(path, O_RDWR) 几乎总能成功——哪怕目标文件正被 vim 编辑或 tail -f 监听。所谓“被占用”在这里是应用层语义,不是内核级锁。

C++14
C++14

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

下载

实操建议:

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

  • 不要指望 open 返回错误来判断占用:它只在路径不存在、权限不足、磁盘满等真实异常时失败
  • 若需跨进程互斥,改用 flock() 或 fcntl(F_SETLK) 加建议性锁(advisory lock):但这要求所有参与者主动配合,无法检测“顽固进程”
  • 极端场景下可查 /proc/*/fd/(Linux)或 lsof 命令输出,但属外部工具依赖,不适合嵌入式或生产环境自动判断

跨平台封装要注意:Windows 和 Unix 行为本质不同,硬统一反而误导

很多跨平台库试图用同一套逻辑封装“检测占用”,结果在 Linux 上永远返回“空闲”,在 Windows 上又因权限/杀毒软件干扰误报。这不是代码写得不够好,而是底层模型不兼容。

实操建议:

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

  • 明确业务需求:你真正要防止的是“写冲突”还是“用户正在编辑”?前者可用原子重命名(rename())替代覆盖;后者可能更适合检查文件修改时间 + 进程名启发式判断
  • 避免封装成 is_file_locked() 这类函数:它在不同系统上含义完全不同,调用方容易产生错误预期
  • Windows 用 CreateFile + 0 共享模式;Linux/macOS 放弃“占用检测”,转向“安全写入”策略(如先写临时文件再 rename)

真正的难点不在怎么调用某个函数,而在于接受:Windows 的文件句柄独占是强语义,Unix 的文件描述符是弱引用。混用这两套模型,比写错参数更容易出问题。

热门AI工具

更多
DeepSeek

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

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

墨刀AI
墨刀AI Hot

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

豆包大模型

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

相关专题

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

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

3419

2023.07.26

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

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

2978

2023.07.27

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

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

1528

2023.08.01

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

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

2699

2023.08.02

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

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

3350

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1697

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

2537

2023.08.28

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

5327

2023.08.30

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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