有没有办法检查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
"这足以解决问题。
答案 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)
}