2013-10-15 103 views
0

我試圖使用fs.existsSync來檢查文件是否存在。當輸入完整的文件系統路徑時,它會成功返回。當路徑包含環境變量如~/foo.bar$HOME/foo.bar時,它無法找到該文件。node.js fs.existsSync爲包含環境變量的路徑返回不正確的值

我已經嘗試了所有從路徑模塊的方法來首先按摩路徑,但似乎沒有任何工作。我應該注意到文件路徑是由用戶通過命令行或JSON文件輸入的。

我知道環境變量生活在process.env,但我想知道是否有某種方式來處理這一點,除了查找/替換每個可能的變量。

回答

3

環境變量由shell擴展。節點的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); 
+0

我真的希望答案是內建的,但這應該工作 – jeffheifetz

2

使用process.env.HOME呢?然後使用path.join獲取正確的路徑。

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