我正在尝试使用fs.existsSync
来检查文件是否存在。输入完整文件系统路径后,它将成功返回。当路径包含~/foo.bar
或$HOME/foo.bar
等环境变量时,无法找到该文件。
我已经尝试了路径模块中的所有方法来首先按摩路径,但似乎没有任何工作。我应该注意,用户通过命令行或JSON文件输入文件路径。
我知道环境变量存在于process.env
中,但我想知道除了每个可能的变量的查找/替换之外是否还有某种方法可以解决这个问题。
答案 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"));