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

时间:2014-12-14 10:48:05

标签: node.js

我问的原因是因为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

3 个答案:

答案 0 :(得分:7)

  

这可能是因为在NodeJs 0.6中,exists()方法位于路径模块中:http://web.archive.org/web/20111230180637/http://nodejs.org/api/path.html - try-catch-finally

^^那个评论回答为什么它不在那里。我会回答你能做些什么(除了不使用古代版本)。

来自fs.exists() documentation

  

特别是,在打开文件之前检查文件是否存在是一种反模式,使您容易受到竞争条件的影响:另一个进程可能会在对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