前提
當前的js文件叫_dirnameandfilename.js和hello.txt同在G:\node練習文件夾下
還有一個_dirnameandfilename.js文件在i:/文件夾,但是i:/里面沒有hello.txt文件
hello.txt文件內容是Hello World
1.我們先來執行第一段代碼
var fs=require('fs'); fs.readFile('./hello.txt','utf8',function(err,data){ if(err){ throw err; } console.log(data); })
(1)我們在G:\node練習執行node命令,
node _dirnameandfilename
這是會成功的輸出Hello World
(2)在G:\node練習執行node命令
node I:\_dirnameandfilename
結果也成功輸出Hello World,但是hello.txt並不在I:\文件夾下,這可以說明
(3)我們在G:\下執行node命令
node I:\_dirnameandfilename
結果告訴我們hello.txt不在G:\文件夾下
node G:\node練習\_dirnameandfilename
這樣運行的結果也是錯誤的
由此可以證明
fs.readFile('./hello.txt','utf8',function(err,data)
此處的./表示的是node命令執行的路徑,而不是相對於正在執行這個js文件來查找hello.txt,在node全局下會發生這樣的錯誤
2.解決在文件讀取中./相對路徑的問題,使./可以表示為正在執行的js文件的路徑
在看文檔時可以知道__dirname,__firename(這里是兩個"_")
__dirname(表示當前正在執行的js所在的目錄),__filename(表示當前正在執行的js的完整路徑)
console.log(__dirname);
console.log(__filename);
我們可以看到當前正在執行的js所在的目錄和當前正在執行的js的完整路徑顯示了出來,那么我們只需要將./hello改變為絕對路徑就可以解決問題了
var fs=require('fs'); var filename=__dirname+'\\'+'hello.txt';//兩個\\是因為轉義 fs.readFile(filename,'utf8',function(err,data){ if(err){ throw err; } console.log(data); })
這個時候,在G:\路徑下執行node命令去運行G:\node練習路徑下的js文件,依然會成功
3.為什么沒有引入__dirname,__filename而就能直接使用?
我們可以看文檔里__dirname介紹
這段話說__dirname,__filename並不是全局的,事實上相當於是本地的
當在執行js文件的時候相當於將js文件的代碼放在了一個函數里
function(__dirname,__filename){ r fs=require('fs'); var filename=__dirname+'\\'+'hello.txt';//兩個\\是因為轉義 fs.readFile(filename,'utf8',function(err,data){ if(err){ throw err; } console.log(data); } )
4.還有問題,我們在路徑拼接時,可能firename是D:/形式,在后面加"//"會導致多一個斜杠
在蘋果電腦上,斜杠是這樣的:"/",所以程序在蘋果電腦上運行會有問題
所以我們希望有一個工具可以幫助我們自動拼接,並且處理兼容問題
node里面提供了一個模塊path幫我們處理路徑
//加載path模塊 var path=require('path'); var fs=require('fs'); var filename=path.join(__dirname,'hello.txt'); fs.readFile(filename,'utf8',function(err,data){ if(err){ throw err; } console.log(data); });
這樣就行了