如何检查文件是否可写(资源不忙或未锁定)

How to check file is writable (resource is not busy nor locked)

excel4node's write to file function catches error and does not propagate 给来电者。因此,我的应用无法判断写入文件是否成功。

我目前的解决方法如下:

let fs = require('fs')
try {
  let filePath = 'blahblah'
  fs.writeFileSync(filePath, '') // Try-catch is for this statement
  excel4nodeWorkbook.write(filePath)
} catch (e) {
  console.log('File save is not successful')
}

它有效,但我认为这是一种 hack,它不是语义正确的方式。我也测试了fs.accessfs.accessSync,但他们只检查权限,而不检查资源的状态(busy/lock)。

是否有任何建议可以在不修改 excel4node 源代码的情况下使它的外观和行为更好?

我认为你问错了问题。如果在时间 T 检查,然后在时间 T + 1ms 写入,如何保证文件仍然可写?

如果文件不可写无论出于何种原因,写入都会失败,就是这样。没事做。您的代码很好,但您也可以不使用 fs.writeFileSync(),这只会删除文件中之前的任何其他内容。

您还可以写入随机生成的文件路径,以合理地确保两个进程不会同时写入同一个文件,但同样,这并不能避免所有可能的写入错误,所以您真的,真正想要的是一些好的错误处理。

为了正确处理错误,您必须提供 callback!

大致如下:

excel4nodeWorkbook.write(filePath, (err) => {
  if (err) console.error(err);
});

注意,这是异步代码,因此您也需要处理它!

您已经在库的源代码中标记了一行。如果你看上面的几行,你可以看到它使用 handler 参数将任何错误传递给。事实上,查看函数上方的文档注释,它说:

If callback is given, callback called with (err, fs.Stats) passed

因此你可以简单地传递一个函数作为你的第二个参数并检查 err 就像你可能已经在节点环境的其他地方看到的那样:

excel4nodeWorkbook.write(filepath, (err) => {
    if (err) {
        console.error(err);
    }
});