node.js fs.existsSync为包含环境变量的路径返回不正确的值

时间:2013-10-15 14:48:57

标签: node.js

我正在尝试使用fs.existsSync来检查文件是否存在。输入完整文件系统路径后,它将成功返回。当路径包含~/foo.bar$HOME/foo.bar等环境变量时,无法找到该文件。

我已经尝试了路径模块中的所有方法来首先按摩路径,但似乎没有任何工作。我应该注意,用户通过命令行或JSON文件输入文件路径。

我知道环境变量存在于process.env中,但我想知道除了每个可能的变量的查找/替换之外是否还有某种方法可以解决这个问题。

2 个答案:

答案 0 :(得分:4)

shell扩展了环境变量。 Node的fs方法直接调用文件系统。

process.env中读取您需要的变量,并使用path.join进行连接。

path.join(process.env.HOME, 'foo.bar');

(请注意,如果您需要跨平台,则Windows上没有HOME变量;我相信它是USERPROFILE。)


由于您正在处理用户输入,因此您必须自己解析路径组件。

首先,规范化输入字符串并将其拆分为数组。

var p = path.normalize(inputStr).split(path.sep);

如果第一个元素是~,请将其替换为主目录。

if (p[0] == '~') p[0] = process.env.HOME || process.env.USERPROFILE; // Windows

然后循环遍历每个元素,如果它以$开头,则替换它。

for (var i = 0; i < p.length; i++) {
    if (p[i][0] == '$') {
        var evar = p[i].substr(1);
        if (process.env[evar]) p[i] = process.env[evar];
    }
}

最后,将路径数组重新加入,重新规范化:

path.join.apply(path, p);

答案 1 :(得分:2)

使用process.env.HOME代替?然后使用path.join获取正确的路径。

fs.existsSync(path.join(process.env.HOME,"foo.bar"));