【问题标题】:What's the most portable way to test if a directory is writable in nodejs?在nodejs中测试目录是否可写的最便携方法是什么?
【发布时间】:2015-07-18 14:25:59
【问题描述】:

一位朋友问我这个问题,我实际上给出了两个选择。

第一种方式,测试文件权限:

//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 通常被操作系统缓存。

这些解决方案都不是完美的。

你会怎么做?我有什么遗漏吗?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    怎么样:

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

    Docs here

    fs.constants.W_OK : 调用进程可以写入文件。

    如果您使用sudo 运行上述操作,您可能会根据用户权限获得不同的输出。

    【讨论】:

    • 有趣的谢谢,这里是commitsudo 不是便携的东西。
    • 是的,我的意思是它会根据当前权限产生不同的结果
    • 请注意fs 已被重构——W_OK 现在位于fs.constants.W_OK
    猜你喜欢
    • 2010-10-12
    • 2013-08-08
    • 2011-06-15
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多