如何检查文件是否可写(资源不忙或未锁定)
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.access
和fs.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);
}
});
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.access
和fs.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);
}
});