fs
fs ( File System ) 文件系統
在node中通過fs模塊來和系統中的文件進行交互 通過fs模塊可以對磁盤中的文件做各種增刪改查的操作 寫入文件 1.同步寫入 2.異步寫入 3.簡單寫入 4.流式寫入 讀取文件 在fs模塊中所有的方法都有兩個版本 不帶sync的,異步方法 帶sync的,同步方法
1、同步寫入
**1.打開要寫入的文件** fs.openSync(path, flags[, mode]) 該方法用來打開一個文件 參數: path:路徑,要打開文件的路徑 flags:操作的類型,要對文件做什么操作 需要字符串作為參數 "w" 寫 "r" 讀 "a" 追加 mode:可選參數,一般不傳,用來設置文件的權限 返回值: fd 文件的描述符 2.寫入並保存 fs.writeSync(fd, string[, position[, encoding]]) 該方法用於向文件中寫入內容 參數: fd: 文件的描述符,需要指定要寫入文件的描述符 string: 要寫入的內容 position: 開始寫入的位置 encoding: 寫入內容的字符編碼,默認utf-8 3.關閉文件 fs.closeSync(fd):: 該方法用來關閉文件 參數: fd 文件的描述符 實例 //引入fs模塊 var fs=require('fs'); var fd=fs.openSync('gzl.txt','w'); fs.writeSync(fd,'1111',10,'utf-8'); fs.closeSync(fd);
2.簡單文件的寫入
簡單文件寫入 fs.writeFile(file, data[, options], callback) fs.writeFileSync(file, data[, options]) - 參數: file 要寫入的文件的路徑 data 要寫入的內容 options 配置對象(可選) encoding 編碼 默認 utf8 flag 操作類型 默認 w mode 文件的權限 默認666,一般不需要傳 callback 回調函數,寫入完成后會調用該函數
3.異步寫入
1.打開文件 fs.open(path, flags[, mode], callback) 參數:callback 回調函數,會在文件打開以后執行 回調函數中會有兩個參數: err: 錯誤信息,如果操作過程中出現了錯誤,則該對象存在,如果沒有出現錯誤,則該參數的值為null 錯誤優先 fd: 文件的描述符 2.寫入文件 fs.write(fd, string[, position[, encoding]], callback) callback 回調函數會在寫入完畢以后執行 參數: err 錯誤對象 byte 寫入的字節數 data 寫入的數據 3.關閉文件 fs.close(fd, callback) 異步寫入的相關代碼::: var fs=require('fs'); fs.open('gzl.txt','a',function (err,fd) { if (!err){ fs.write(fd,'ffffff',10,function (err,bite,data) { if (!err){ console.log('文件寫入成功'); }; fs.close(fd,function (err) { if (!err){ console.log('文件已關閉'); }; }); }); }; });
4.流式文件的寫入與讀取
流式文件寫入
其他的文件的寫入方式都是一次性將一個內容寫入到文件中的,
如果文件太大了則會導致運行速度過慢,會嚴重影響程序的性能
流式文件寫入適合較大的文件寫入,可以分多次將多個內容輸出到文件中
相關代碼: //創建一個可寫流(WriteStream) var ws = fs.createWriteStream("hello3.txt"); //為流綁定一個open和close事件,來監聽流是否打開和關閉 ws.once("open",function () { console.log("流打開了~~~"); }); ws.once("close",function () { console.log("流關閉了~~~"); }); //通過可寫流向文件中輸出內容 ws.write("O(∩_∩)O哈哈~"); ws.write("O(∩_∩)O~"); //關閉流 ws.end();
流式文件讀取 適合較大的文件讀取
相關代碼: //創建一個可讀流 var rs = fs.createReadStream("C:\\Users\\lilichao\\Desktop\\筆記.mp3"); //創建一個可寫流 var ws = fs.createWriteStream("a.mp3"); //監聽流的狀態 rs.once("open",function () { console.log("可讀流已經打開"); }); rs.once("close",function () { console.log("可讀流已經關閉"); //關閉可寫流 ws.end(); }); ws.once("open",function () { console.log("~~~~可寫流已經打開"); }); ws.once("close",function () { console.log("~~~~可寫流已經關閉"); }); //要讀取一個可讀流中的數據,必須要給該流綁定一個data事件 //綁定data事件后,流會自動讀取數據,數據讀取完畢以后,流會自動關閉 //讀取到的數據會通過回調函數的參數的形式返回 rs.on("data",function (data) { //console.log(data.length); //將數據線寫入到可寫流中 ws.write(data); }); 簡單方法:: //創建一個可讀流 var rs = fs.createReadStream("C:\\Users\\lilichao\\Desktop\\筆記.mp3"); //創建一個可寫流 var ws = fs.createWriteStream("b.mp3"); //將可讀流中的數據寫入到可寫流中 rs.pipe(ws);
5.其他讀取文件
相關代碼: /* 驗證路徑是否存在 fs.existsSync(path) 獲取文件信息 fs.stat(path, callback) fs.statSync(path) 刪除文件 fs.unlink(path, callback) fs.unlinkSync(path) */ var result = fs.existsSync("ab.jpg"); //console.log(result); fs.stat("a.jpg", function (err , stats) { if(!err){ //stats 是一個對象,在該對象中保存了當前文件的狀態信息 /* 通過該對象可以獲取文件的狀態 stats.size 獲取文件的大小 stats.isFile() 是否是文件 stats.isDirectory()是否是目錄 */ //console.log(stats.isDirectory()); } }); //刪除文件 //fs.unlinkSync("hello.txt"); /* 列出文件 fs.readdir(path[, options], callback) fs.readdirSync(path[, options]) 截斷文件 fs.truncate(path, len, callback) fs.truncateSync(path, len) 建立目錄 fs.mkdir(path[, mode], callback) fs.mkdirSync(path[, mode]) */ /* fs.readdir(".",function (err , files) { if(!err){ //files是一個保存了目錄下文件(夾)名字的string數組 console.log(files[0]); } });*/ //截斷文件 將文件截斷成指定的大小,會丟失數據 //fs.truncateSync("hello2.txt",10); //創建目錄 //fs.mkdir("hello"); /* 刪除目錄 fs.rmdir(path, callback) fs.rmdirSync(path) 重命名文件和目錄 fs.rename(oldPath, newPath, callback) fs.renameSync(oldPath, newPath) - 通過該方法也可以實現剪切的功能 監視文件更改寫入 fs.watchFile(filename[, options], listener) - 參數: filename 文件名 options 配置對象 listener 回調函數,當前文件發生變化時,該函數將會執行 - curr 表示文件現在的狀態 - prev 表示文件修改前的狀態 - 這兩個對象都是stats對象 */ //fs.rmdir("hello"); /*fs.rename("b.mp3","C:\\Users\\lilichao\\Desktop\\b.mp3",function (err) { if(!err){ console.log("修改成功"); } });*/ fs.watchFile("hello2.txt",{interval:1000},function (curr,prev) { console.log("當前文件的大小為: "+curr.size); console.log("修改前文件的大小為: "+prev.size); });