2014-12-08 4 views
1

Есть ли способ проверить, существует ли файл в NodeJS с чувствительностью к регистру, , даже если базовая файловая система не чувствительна к регистру?проверить, существует ли файл (с учетом регистра)

fs.exists() может быть или не быть чувствительным к регистру в зависимости от базовой файловой системы.

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

Это вызывает проблемы при разработке приложения на среду разработки регистронезависимом, который будет развернут на сервере регистрозависимой. У меня недавно была проблема, когда сборка была разбита опечаткой. Он работал на местном уровне.

Если я могу получить Узел, чтобы сказать мне: «Да, README.TXT существует, и он хранится как readme.txt», который будет достаточным для решения проблемы.

+0

Я думаю, что http://nodejs.org/api/fs.html#fs_fs_realpathsync_path_cache сделал бы трюк (хотя вы, вероятно, захотите попробовать ухватить его, поскольку он может бросить) – generalhenry

+3

вы можете попробовать сделать readdir сперва - afaik on osx возвращает имена в оригинальном футляре –

+0

@generalhenry Хорошая мысль. К сожалению, он возвращает тот же случай, что и вход. –

ответ

6

Следующее предложение 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

Это блестяще. Спасибо! –

Смежные вопросы