Друг задал мне этот вопрос, и я дал де-факто два варианта.Какой самый переносимый способ проверить, доступен ли каталог для записи в nodejs?
Первый способ, тестирование файлов разрешения:
//adapted from https://stackoverflow.com/questions/11775884/nodejs-file-permissions#answer-11781404
var fs = require('fs')
function canWrite(directory) {
var stat = fs.statSync(directory)
// 2 is the octal value for chmod -w-
return !!(2 & (stat.mode & parseInt('777', 8)).toString(8)[0]) //first char is the owner
}
Что делать, если пользователь (process.uid
) не был владельцем файловой системы (stat.uid
) ни в его группе (process.gid vs stat.gid
)? Он все равно получит разрешения 644
, и запись будет невозможна.
Как мы можем узнать (с nodejs), что текущий пользователь принадлежит к группе файловых систем (stat.gid
)? Easy in bash, но чтобы быть портативным, это был бы беспорядок с nodejs.
Второй путь, ленивый:
var fs = require('fs')
var canWrite = true
try {
fs.writeFileSync('./test')
fs.unlinkSync('./test')
} catch(e) {
canWrite = false
}
if(canWrite) {
//go for it
}
Ленивое решение Кауса, но он должен делать эту работу. Это также может блокировать буфер ядра. С другой стороны, fs.Stat
обычно кэшируется операционными системами.
Ни одно из этих решений не является совершенным.
Как вы поживаете? Есть что-то, что мне не хватает?
Интересное спасибо, здесь [commit] (https://github.com/joyent/node/commit/29449349da5ef7e23689396c21bae003d81e0081). 'sudo' - это не переносная вещь. – soyuka
Да, я просто имел в виду, что он дает разные результаты на основе текущих разрешений – Maroshii