首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lockfile.locksync在node.js中锁定文件

使用lockfile.locksync在node.js中锁定文件
EN

Stack Overflow用户
提问于 2016-11-29 11:05:33
回答 1查看 2.2K关注 0票数 1

我正在使用lockfile.locksync锁定node.js中的一个文件。但我想知道这个实用程序的完整机制。到目前为止,每个网站都说这是一个“非常礼貌的锁文件实用程序”,但没有解释这个实用程序的内部机制。

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2020-05-14 12:45:45

节点FS

要理解Node.js中的文件选项,请看一下标志和Linux,其中包括以下选项

O_TRUNC -截断现有文件

O_CREAT -如果不存在创建

O_WRONLY -访问模式,只写

O_EXCL -确保此调用创建文件。如果文件存在,则在与O_CREAT配对时触发EEXIST错误。

但它不提供类似于"群群"的文件锁替代方案

NPM LOCKFILE调查

我尝试使用称为“锁文件”的npm库,因为其中包含了太多的复制/粘贴示例。

判决。当前实现"v1.0.4“的”锁文件“npm库是不完整/无用的!

来自来源

代码语言:javascript
复制
exports.lockSync = function (path, opts) {
  opts = opts || {}
  opts.req = opts.req || req++
  debug('lockSync', path, opts)
  if (opts.wait || opts.retryWait) {
    throw new Error('opts.wait not supported sync for obvious reasons')
  }

  try {
    var fd = fs.openSync(path, wx)
    locks[path] = fd
    try { fs.closeSync(fd) } catch (er) {}
    debug('locked sync!', path, fd)
    return

这样,在“尝试{}”中的5行实际代码只会在"wx“模式下阻止"openSync”,将"path“保存到"lockspath”和"closeSync“。如果文件存在,它将失败!因为"wx"!

您不能用“锁文件”库锁定现有文件!

最后,它尝试用以下代码调用具有unlockSync信号的“onExit”:

代码语言:javascript
复制
exports.unlockSync = function (path) {
  debug('unlockSync', path)
  // best-effort.  unlocking an already-unlocked lock is a noop
  try { fs.unlinkSync(path) } catch (er) {}
  delete locks[path]
}

是的,它会在进程退出后删除您的文件!

,这不是文件锁定机制!

NODEJS文件锁有可靠的解决方案吗?

我发现fs-ext的工作非常完美!使用node进程打开2个选项卡,检查锁定文件意味着什么:

tab1

代码语言:javascript
复制
const fs = require("fs");
const {flockSync} = require('fs-ext');
const fd = fs.openSync('1.txt', 'w');
flockSync(fd, 'ex');

tab2

代码语言:javascript
复制
const fs = require("fs");
const {flockSync} = require('fs-ext');
const fd = fs.openSync('1.txt', 'r');
flockSync(fd, 'sh'); // PENDING!

在tab2中,flockSync(fd, 'sh');将挂起直到在tab1中调用flockSync(fd, 'un');

真的很管用!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40864311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档