1.Node.js 文件系統(fs 模塊)模塊中的方法均有異步和同步版本
例如讀取文件內容的函數有異步的 fs.readFile() 和同步的 fs.readFileSync()。
2.異步的方法函數最後一個參數爲回調函數,回調函數的第一個參數包含了錯誤信息(error)。
3.建議使用異步方法,比起同步,異步方法性能更高,速度更快,而且沒有阻塞
非阻塞:使用異步方法,讀取和後續代碼同時執行
阻塞:使用同步方法,等待讀取完成後,再去執行後續
- 讀取文件
Server.js:
//運行服務端,配置端口
module.exports=function(app){
let http=require("http");
http.createServer(app).listen(3100);
}
app.js:
- writeHead 讀取文件(一次性讀取):
let fs=require("fs");
//傳入回調函數返回
let app=require("./node_modules/Server/Server");
app(function(req,res){
if(req.url!="/favicon.ico"){
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
res.write("服務器");
//使用異步讀取服務端文件
let content="";
let promise=new Promise(function(resolve){
fs.readFile("./data.txt",function(err,data){
if(err) throw err;
//讀取出來的數據爲buffer 需要使用toString
content=data.toString();
resolve(content); //後執行
});
});
//readFile爲異步讀取,使用Promise異步編程實現同步讀取
promise.then(function(data){
console.log(data);
});
//使用同步讀取服務端文件
let text=fs.readFileSync("./data.txt");
console.log(text.toString()); //先執行
res.end();
}
});
注:路徑兩種寫法:./data.txt
、E:/node/node02/bases.txt
- read 讀取文件(讀取文件前需先打開,打開之後寫入到緩衝區,然後從緩衝區轉換出來)
優點:數據較多時,可以分段讀取,第二段爲第一段的結尾
(1)異步模式下讀取文件的語法格式:fs.read(fd, buffer, offset, length, position, callback)
(2)參數使用說明如下:
fd - 通過 fs.open() 方法返回的文件描述符。
buffer - 數據寫入的緩衝區。
offset - 緩衝區寫入的寫入偏移量。
length - 要從文件中讀取的字節數。
position - 文件讀取的起始位置,如果 position 的值爲 null,則會從當前文件指針的位置讀取。
callback - 回調函數,有三個參數err, bytesRead, buffer,err 爲錯誤信息, bytesRead 表示讀取的字節數,buffer 爲緩衝區對象。
//創建buffer 緩衝區
let buf=new Buffer.alloc(1024);
fs.open("./list/data.txt","r+",function(err,fd){
if(err) throw err;
console.log("文件打開完成");
fs.read(fd,buf,0,buf.length,0,function(error,bytes){
if(error) throw err;
console.log(buf.slice(0,bytes).toString());
//讀取完成後,關閉文件流
fs.close(fd,function(cerr){
if(cerr) throw err;
console.log("文件關閉完成");
});
});
});
- 打開文件
(1)在異步模式下打開文件的語法格式:fs.open(path, flags[, mode], callback)
(2)參數使用說明如下:
path - 文件的路徑。
flags - 文件打開的行爲。具體值詳見下文。
mode - 設置文件模式(權限),文件創建默認權限爲 0666(可讀,可寫)。
callback - 回調函數,帶有兩個參數如:callback(err, fd)。
(3)flags 參數可以是以下值:
//打開文件
console.log("準備打開文件");
fs.open("./list/stu.txt","r+",function(err,fd){
if(err) throw err;
console.log("打開文件成功",fd);
});
- 獲取文件信息
(1)通過異步模式獲取文件信息的語法格式:fs.stat(path, callback)
(2)參數使用說明如下:
path - 文件路徑。
callback - 回調函數,帶有兩個參數如:(err, stats), stats 是 fs.Stats 對象。
(3)stats類中的方法有:
//stat 判斷當前的文件是什麼類型
fs.stat("./list",function(err,stat){
if(err) throw err;
console.log(stat.isFile(),stat.isDirectory()); //false true
});
- 文件寫入
(1)異步模式下寫入文件的語法格式:fs.writeFile(file, data[, options], callback)
(2)參數使用說明如下:
file - 文件名或文件描述符。
data - 要寫入文件的數據,可以是 String(字符串) 或 Buffer(緩衝) 對象。
options - 該參數是一個對象,包含 {encoding, mode, flag}。默認編碼爲 utf8, 模式爲 0666 , flag 爲 'w'
callback - 回調函數,回調函數只包含錯誤信息參數(err),在寫入失敗時返回。
覆蓋型寫入:
//異步寫入文件
let data="我是寫入的數據————更新的數據"
fs.writeFile("./list/stu.txt",data,function(err){
if(err){
console.log("文件寫入失敗");
}
console.log("文件寫入成功");
});
//同步寫入文件
let su=fs.writeFileSync("./list/stu.txt",data);
console.log(su);
追加式寫入;
//追加型寫入
let data="更新的數據\n"
fs.appendFile("./list/stu.txt",data,function(err){
if(err){
console.log("文件寫入失敗");
}
console.log("文件寫入成功");
});
- 目錄
(1)創建目錄
//創建目錄
fs.mkdir("./list/sub",function(err){
if(err) throw err;
console.log("創建目錄成功");
});
(2)讀取目錄
//讀取目錄
fs.readdir("./list/sub",function(err,files){
if(err) throw err;
console.log(files);
});
(3)讀取固定目錄,判斷裏面的所有子目錄是文件還是文件夾
fs.readdir("./list/sub",function(err,files){
if(err) throw err;
//讀取的目錄文件進行遍歷
for(let key in files){
fs.stat("./list/sub/"+files[key],function(error,stat){
if(error) throw err;
console.log(stat.isFile());
console.log(stat.isDirectory());
});
}
});
目錄: