1

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

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

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

4

2 回答 2

4

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

读取您需要的变量process.env并用于path.join连接。

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

HOME(请记住,如果您需要跨平台,Windows 上没有变量;我相信它是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);
于 2013-10-15T14:52:55.800 回答
2

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

fs.existsSync(path.join(process.env.HOME,"foo.bar"));
于 2013-10-15T14:53:25.620 回答