nodejs fs.createWriteStream 写入文件过程中,把文件改变路径或者删除,如何捕获这种场景的事件?

Node.js Version: v10.16.1
OS: macOS 10.14.5
Scope (install, code, runtime, meta, other?): code
Module (and version) (if relevant): fs

关联: https://github.com/nodejs/hel...

复现步骤:

1) 创建一个writeStream

> node
const fs = require('fs');
const ws = fs.createWriteStream('./test', { flags: 'a' })

这时候系统中会创建文件
clipboard.png

2) 可以写入一些内容

ws.write('123\n');
ws.write('123\n');
ws.write('123\n');

3) 把文件删除移动到废纸篓或者删除

clipboard.png

4) 继续调用write()写入

fs.existSync('./test'); // false
ws.on('error', err => console.log(err)); // 并不会报错
ws.write('123\n'); 
ws.write('123\n'); 
ws.write('123\n'); 

此时即使文件已经不存在,也不会再创建文件,调用方法也不会出现报错。

期望的结果是能继续写入文件,如果文件路径改变或者被删除,也能在目标路径中继续创建文件写入

阅读 7.2k
3 个回答

这个事情与操作系统/文件系统有关。

Windows 一般不存在这种情况,它在文件被打开时会禁止文件的删除或移动。

Linux / MacOS 用的是不同的文件系统,可以在文件还被打开的时候删除和移动。

有些 Linux 系统用 inotify 可以用于监控文件的变化,npm 里也有一个 inotify 包。但是不确认在 MacOS 下是不是好使。

然后,就是只能定期看一下文件是不是有变化了,比如定期用 fs.stats 看一下文件还在不在,以及 stats.ino 是不是变化了(有可能原来的文件被移动了,但是在原位置又新创建了一个同名文件)

unix是这样的

你可以每次写时重新打开,或者定期rotate

刚刚测试了一下.通过监听目录变化检测到删除.

fs.watch('.', (e, file) => {
  if (e === 'rename' && file === 'test') {
    if (!fs.existsSync(file)) {
      console.log([e, file]);
    }
  }
});
推荐问题