2015-05-07 2 views
3

Друг задал мне этот вопрос, и я дал де-факто два варианта.Какой самый переносимый способ проверить, доступен ли каталог для записи в 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 обычно кэшируется операционными системами.

Ни одно из этих решений не является совершенным.

Как вы поживаете? Есть что-то, что мне не хватает?

ответ

7

насчет:

var fs = require('fs'); 

fs.access(__dirname, fs.W_OK, function(err) { 
    if(err){ 
    console.error("can't write"); 
    process.exit(1); 
    } 

    console.log("can write"); 
    process.exit(0); 
}); 

Docs here

fs.W_OK: Файл может быть написано процесс вызывающим.

Если вы запустите вышеуказанное с помощью sudo, вы можете получать разные выходы в зависимости от прав пользователя.

+0

Интересное спасибо, здесь [commit] (https://github.com/joyent/node/commit/29449349da5ef7e23689396c21bae003d81e0081). 'sudo' - это не переносная вещь. – soyuka

+0

Да, я просто имел в виду, что он дает разные результаты на основе текущих разрешений – Maroshii

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