我问的原因是因为ubuntu上的Node.js似乎没有fs.exists()函数。虽然我在Mac上运行Node.js时可以调用它,但是当我部署到服务器时,它会失败,并显示该函数不存在的错误。
现在,我知道有些人认为这是一种反模式"检查文件是否存在,然后尝试编辑/打开它等,但在我的情况下,我从不删除这些文件,但我仍然需要在写入之前检查它们是否存在。
那么如何检查目录(或文件)是否存在?
编辑:
这是我在名为' temp。' s'的文件中运行的代码。 :
var fs=require('fs');
fs.exists('./temp.js',function(exists){
if(exists){
console.log('yes');
}else{
console.log("no");
}
});
在我的Mac上,它运行正常。在ubuntu上我收到错误:
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^ TypeError: Object #<Object> has no method 'exists'
at Object.<anonymous> (/home/banana/temp.js:2:4)
at Module._compile (module.js:441:26)
at Object..js (module.js:459:10)
at Module.load (module.js:348:32)
at Function._load (module.js:308:12)
at Array.0 (module.js:479:10)
at EventEmitter._tickCallback (node.js:192:41)
在我的Mac上 - 版本:v0.13.0-pre 在Ubuntu上 - 版本:v0.6.12
答案 0 :(得分:7)
这可能是因为在NodeJs 0.6中,
exists()
方法位于路径模块中:http://web.archive.org/web/20111230180637/http://nodejs.org/api/path.html - try-catch-finally
^^那个评论回答为什么它不在那里。我会回答你能做些什么(除了不使用古代版本)。
特别是,在打开文件之前检查文件是否存在是一种反模式,使您容易受到竞争条件的影响:另一个进程可能会在对
fs.exists()
和fs.open()
的调用之间删除该文件。只需打开文件并在错误处理时处理错误。
你可以这样做:
fs.open('mypath','r',function(err,fd){
if (err && err.code=='ENOENT') { /* file doesn't exist */ }
});
答案 1 :(得分:6)
接受的答案没有考虑到节点fs模块文档建议使用fs.stat替换fs.exists(请参阅the documentation)。
我最终选择了这个:
function filePathExists(filePath) {
return new Promise((resolve, reject) => {
fs.stat(filePath, (err, stats) => {
if (err && err.code === 'ENOENT') {
return resolve(false);
} else if (err) {
return reject(err);
}
if (stats.isFile() || stats.isDirectory()) {
return resolve(true);
}
});
});
}
注意ES6语法+ Promises - 这个的同步版本会更简单一些。此外,我的代码还检查路径字符串中是否存在目录,如果stat对它感到满意则返回true - 这可能不是每个人都想要的。
答案 2 :(得分:0)
Sync方法没有任何通知错误的方法。除了例外!事实证明,当文件或目录不存在时,fs.statSync方法会抛出异常。创建同步版本就像这样简单:
function checkDirectorySync(directory) {
try {
fs.statSync(directory);
} catch(e) {
try {
fs.mkdirSync(directory);
} catch(e) {
return e;
}
}
}
就是这样。 使用就像以前一样简单:
checkDirectorySync("./logs");
//directory created / exists, all good.
[]'z