Node.js 如何在不使用fs.exists的情况下检查文件或目录是否存在?
我之所以这么问,是因为ubuntu上的Node.js似乎没有fs.exists()函数。虽然我可以在Mac上运行Node.js时调用此函数,但当我部署到服务器时,它会失败,并出现一个错误,表示该函数不存在Node.js 如何在不使用fs.exists的情况下检查文件或目录是否存在?,node.js,Node.js,我之所以这么问,是因为ubuntu上的Node.js似乎没有fs.exists()函数。虽然我可以在Mac上运行Node.js时调用此函数,但当我部署到服务器时,它会失败,并出现一个错误,表示该函数不存在 现在,我知道有些人认为它是一个“反模式”来检查文件是否存在,然后尝试编辑/打开它,但是在我的例子中,我从来没有删除这些文件,但是我仍然需要检查它们是否存在,然后再写给他们。 那么,如何检查目录(或文件)是否存在 编辑: 这是我在名为“temp.s”的文件中运行的代码: var fs=requi
现在,我知道有些人认为它是一个“反模式”来检查文件是否存在,然后尝试编辑/打开它,但是在我的例子中,我从来没有删除这些文件,但是我仍然需要检查它们是否存在,然后再写给他们。 那么,如何检查目录(或文件)是否存在
编辑: 这是我在名为“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)
node.js:201
抛出e;//process.nextTick错误,或第一次勾选时的“error”事件
^TypeError:对象#没有方法“exists”
反对。(/home/banana/temp.js:2:4)
在模块处编译(Module.js:441:26)
at Object..js(module.js:459:10)
在Module.load(Module.js:348:32)
at功能。加载(module.js:308:12)
at Array.0(module.js:479:10)
在EventEmitter上进行回调(node.js:192:41)
在我的Mac上-版本:v0.13.0-pre
在Ubuntu上-版本:v0.6.12
这可能是因为在NodeJs 0.6中,
exists()
方法位于路径模块中:
^^这句话回答了为什么它不在那里。我会回答你能做些什么(除了不使用古代版本)
从:
特别是,在打开文件之前检查文件是否存在是一种反模式,这会使您容易受到竞争条件的影响:另一个进程可能会在调用fs.exists()
和fs.open()
之间删除该文件。只要打开文件,在不存在错误时处理错误
你可以这样做:
fs.open('mypath','r',function(err,fd){
if (err && err.code=='ENOENT') { /* file doesn't exist */ }
});
接受的答案没有考虑节点fs模块文档建议使用fs.stat替换fs.exists(请参阅) 我最后说的是:
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语法+承诺-同步版本会更简单一些。此外,我的代码还检查路径字符串中是否存在目录,如果stat满意,则返回true-这可能不是每个人都想要的。同步方法无法通知错误。除了例外!事实证明,当文件或目录不存在时,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您的问题是错误的,应该是“为什么缺少fs.exists()?”。您能添加您的PC和Mac上有哪些NodeJs版本吗?你有什么错误?类似“存在不是一个函数”之类的东西?
FS
对象上是否缺少其他典型的FS方法?你需要怎样的fs
?我正在运行Ubuntu,你的代码对我来说很好。所以这是你特定机器上的问题。您是如何安装node的?您正在运行哪个版本的Node和Ubuntu?这可能是因为在NodeJs 0.6中,exists()
方法位于路径
模块中:是的,版本似乎太旧了。