node——讀取文件中的路徑問題


 

前提

當前的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);
});

這樣就行了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM