Node.js 如何在不使用fs.exists的情况下检查文件或目录是否存在?

Node.js 如何在不使用fs.exists的情况下检查文件或目录是否存在?,node.js,Node.js,我之所以这么问,是因为ubuntu上的Node.js似乎没有fs.exists()函数。虽然我可以在Mac上运行Node.js时调用此函数,但当我部署到服务器时,它会失败,并出现一个错误,表示该函数不存在 现在,我知道有些人认为它是一个“反模式”来检查文件是否存在,然后尝试编辑/打开它,但是在我的例子中,我从来没有删除这些文件,但是我仍然需要检查它们是否存在,然后再写给他们。 那么,如何检查目录(或文件)是否存在 编辑: 这是我在名为“temp.s”的文件中运行的代码: var fs=requi

我之所以这么问,是因为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)
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()
方法位于
路径
模块中:是的,版本似乎太旧了。