fs.exists方法
方法說明:
測試某個路徑下的文件是否存在。回調函數包含一個參數exists,true則文件存在,否則是false。
語法:
fs.exists(path, callback)
由於該方法屬於fs模塊,使用前需要引入fs模塊(var fs= require(“fs”) )
接收參數:
path 欲檢測的文件路徑,
callback 回調
例子1:
fs.exists('/etc/passwd', function (exists) { util.debug(exists ? "it's there" : "no passwd!"); });
以上是筆者在網上查到語法和示例,但是實際使用的時候卻發現了問題!
問題代碼與解決
例子2:
代碼如下:(此代碼也是網上示例)
http.createServer(function(req, res){ var reqPath = url.parse(req.url).pathname; fs.exists(reqPath, function(exists){ if(!exists){ consloe.log(reaPath + ' not exists.'); }else{ //do something } }); });
服務端調用后會提示 xxx not exists。不論這個文件是否存在都會提示這個錯誤。這明顯是fs.exists這個回調參數都會false,才會出現這個情況,也就是說這個路徑下文件無法找到相應文件。我們用console.log將reqPath打印出來,如下:
/index.html
目錄中文件的確存在,可是為何提示不存在那?筆者通過查詢網上回答和參閱資料發現了問題
fs.exists方法中參數path默認情況下路徑是根目錄開始完整路徑,也就是文件的絕對路徑。
所以例子1中,參數path使用的是'/etc/passwd',熟悉Linux的都知道etc是Linux服務器根目錄下幾個目錄之一。
找到了問題,下面我們看解決方法:
方法1:
在為參數path前面加個. 或者__dirname,如示例中的console返回的實際地址就是'./index.html'或'__dirname/index.html'。
在nodejs中./xxxx指的是當前目錄,__dirname指的是獲取當前模塊文件所在目錄的完整絕對路徑(適用於調用此方法的文件目錄與網站目錄不同情況),具體用法可以自行百度。
代碼可修改為:
http.createServer(function(req, res){ var reqPath = url.parse(req.url).pathname; var realPath = '.'+reqPath;//var realPath = __dirname+reqPath; fs.exists(realPath, function(exists){ if(!exists){ consloe.log(reaPath + ' not exists.'); }else{ //do something } }); });
方法2:
使用path.join返回拼接后的路徑,如示例2中可加入var realPath = path.join("/usr/www", reqPath),筆者的web服務器端完整目錄是/usr/www,所以將這個目錄拼接上,之所以使用這個方法是可以正確的使用當前系統的路徑分隔符,兼容兩種系統。使用方法如下:
path.join([path1][, path2][, ...])用於連接路徑。該方法的主要用途在於,會正確使用當前系統的路徑分隔符,Unix系統是"/",Windows系統是"\"。
代碼可修改為:
http.createServer(function(req, res){ var reqPath = url.parse(req.url).pathname; var realPath = path.join('/usr/www',reqPath); fs.exists(realPath, function(exists){ if(!exists){ consloe.log(reaPath + ' not exists.'); }else{ //do something } }); });
以上兩種方法都可以在目錄正確和文件存在的情況下,正確的執行do something了。
nodejs新手,如有錯誤之處,請見諒。如幫忙指出,更是不勝感激。