You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中如何读取被其他进程锁定的文件?

读取被其他进程锁定文件的实现方案

调用默认fs.readFileSync抛出EBUSY错误是因为目标文件被其他进程加了访问锁,原生及第三方解决方案如下:

原生实现

Node.js 原生fs模块可通过指定文件打开Flag绕过锁限制,不需要额外引入依赖:

  • 跨平台通用简易方案:传入rs Flag启用同步读模式并绕过系统本地缓存,大部分轻量锁场景可直接生效:
const fs = require('fs');
// 传入flag参数覆盖默认的'r'模式
const fileContent = fs.readFileSync('被锁定的目标文件路径', { flag: 'rs' });
  • Windows 平台精准配置:如果上述方案不生效,可手动组合Windows系统的文件共享权限常量,允许读取被其他进程读写占用的文件:
const fs = require('fs');
// 打开文件时指定共享读、共享写、共享删除权限,绕过排他锁限制
const fileDescriptor = fs.openSync(
  '被锁定的目标文件路径',
  fs.constants.O_RDONLY | 
  fs.constants.O_SHARE_READ | 
  fs.constants.O_SHARE_WRITE | 
  fs.constants.O_SHARE_DELETE
);
// 读取文件内容
const fileSize = fs.fstatSync(fileDescriptor).size;
const contentBuffer = Buffer.alloc(fileSize);
fs.readSync(fileDescriptor, contentBuffer, 0, fileSize, 0);
fs.closeSync(fileDescriptor);
// 转字符串即可使用
const fileContent = contentBuffer.toString();

注意:如果目标文件被其他进程加上了内核级强制排他锁,原生方案也无法读取,需要使用第三方重试增强工具。

第三方工具包

社区有多个成熟工具包可以简化锁冲突处理逻辑:

  • graceful-fs:原生fs模块的增强drop-in替换包,内部自动处理EBUSY、EMFILE等常见IO错误,内置重试逻辑,替换引入后不需要修改原有读写代码:
// 直接替换原生fs引入即可
const fs = require('graceful-fs');
const fileContent = fs.readFileSync('被锁定的目标文件路径');
  • read-file-safe:专门面向异常场景的文件读取工具,默认内置锁冲突、权限不足等错误的处理逻辑,读取失败时返回null而非抛出异常,不需要额外配置:
const { sync: readFileSync } = require('read-file-safe');
const fileContent = readFileSync('被锁定的目标文件路径');
  • fs-ext:扩展了原生fs的锁控制能力,支持自定义锁类型、超时重试规则,适合需要精细化控制文件访问权限的复杂场景。

内容的提问来源于stack exchange,提问作者Tembero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:30:05