我正在尝试使用fs.existsSync
来检查文件是否存在。当输入完整的文件系统路径时,它会成功返回。当路径包含类似~/foo.bar
or的环境变量$HOME/foo.bar
时,找不到文件。
我已经尝试了路径模块中的所有方法来首先按摩路径,但似乎没有任何效果。我应该注意,文件路径是由用户通过命令行或 JSON 文件输入的。
我知道环境变量存在于 中process.env
,但我想知道除了查找/替换每个可能的变量之外是否还有其他方法可以处理这个问题。
我正在尝试使用fs.existsSync
来检查文件是否存在。当输入完整的文件系统路径时,它会成功返回。当路径包含类似~/foo.bar
or的环境变量$HOME/foo.bar
时,找不到文件。
我已经尝试了路径模块中的所有方法来首先按摩路径,但似乎没有任何效果。我应该注意,文件路径是由用户通过命令行或 JSON 文件输入的。
我知道环境变量存在于 中process.env
,但我想知道除了查找/替换每个可能的变量之外是否还有其他方法可以处理这个问题。
环境变量由 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);
改用 process.env.HOME 吗?然后使用 path.join 获取正确的路径。
fs.existsSync(path.join(process.env.HOME,"foo.bar"));