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

时间:2019-01-01 14:12:15

标签: node.js file

excel4nodewrite 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')
}

它可以工作,但是我认为这是一种破解,并且不是在语义上正确的方式。我还测试了fs.accessfs.accessSync,但它们仅检查许可权,而不检查资源的状态(忙/锁)。

在不修改excel4node源代码的情况下,是否有任何更好的外观和表现建议?

2 个答案:

答案 0 :(得分:1)

我认为您是在问错问题。如果您在时间T进行检查,然后在时间T + 1ms写入,那么什么可以保证文件仍然可写?

如果由于某种原因该文件不可写 ,则写入将失败。没事做。您的代码很好,但是您也可以不用fs.writeFileSync(),它只会删除文件中的其他内容。

您还可以写入随机生成的文件路径,以确保两个进程不会同时写入同一文件,但是同样,这也不能防止所有可能的写入错误,因此,您的实际情况是,真正想要的是一些良好的错误处理。

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

类似的东西:

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

当心,这是异步代码,因此您也需要处理!

答案 1 :(得分:1)

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

  

如果提供了回调,则通过(err,fs.Stats)调用的回调将被传递

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

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