检查文件是否存在(区分大小写)

时间:2014-12-08 21:27:02

标签: node.js operating-system case-sensitive

有没有办法检查NodeJS中是否存在文件,区分大小写,即使基础文件系统不区分大小写

fs.exists()可能会也可能不区分大小写,具体取决于基础文件系统。

 fs = require('fs');
 fs.existsSync('readme.txt') // true
 fs.existsSync('README.TXT') // false (or true, depending on the file system)

在不区分大小写的开发环境中开发应用程序时会出现问题,该开发环境将部署在区分大小写的服务器上。我最近遇到了一个问题,即构建被打破了。它在当地工作。

如果我可以让Node告诉我,"是的,README.TXT存在,并且它存储为readme.txt"这足以解决问题。

3 个答案:

答案 0 :(得分:7)

根据Andrey的建议,我实现了一个使用readdir的函数。

var fs = require('fs');
var path = require('path');

function fileExistsWithCaseSync(filepath) {
    var dir = path.dirname(filepath);
    if (dir === '/' || dir === '.') return true;
    var filenames = fs.readdirSync(dir);
    if (filenames.indexOf(path.basename(filepath)) === -1) {
        return false;
    }
    return fileExistsWithCaseSync(dir);
}

console.log(fileExistsWithCaseSync(__dirname + '/README.txt')) // false
console.log(fileExistsWithCaseSync(__dirname + '/readme.txt')) // true

我不会在生产中使用此功能,因为每次调用都会对文件系统进行多次同步访问。但它足以满足我的需求:当实际调用文件Foo.js时,阻止我的本地开发服务器提供foo.js(在生产中不起作用)。

答案 1 :(得分:2)

只是为了帮助遇到此路径问题的人。

Patric的函数在这种情况下非常有效,但不能解决路径问题。我发现true path module实际上可以解决Linux(ubuntu)上区分大小写的路径的问题。

查看更多信息here

答案 2 :(得分:2)

因为我无法评论<50个代表,所以我会发表新帖子。

@patrik的解决方案在Windows上运行良好,但由于根检查而无法在Windows上运行

我将其更改为如下所示:

function fileExistsWithCaseSync (filepath) {
  var dir = path.dirname(filepath)
  if (dir === path.dirname(dir)) {
    return true
  }
  var filenames = fs.readdirSync(dir)
  if (filenames.indexOf(path.basename(filepath)) === -1) {
    return false
  }
  return fileExistsWithCaseSync(dir)
}