摘要:一個例子測試返回值當緩存區寫滿時,輸出一個例子當緩存區數據全部輸出時,觸發事件系統緩存區數據已經全部輸出。數據可讀文件讀取完成系統緩存區數據已經全部輸出。要寫入的數據文件已經打開,文件描述符是文件系統模塊同步更新
環境:Node v8.2.1; Npm v5.3.0; OS Windows10
1、fs 模塊APInodejs的文件操作大部分API都提供了同步和異步的兩種方式,下面是異步API結構圖,同步方法在異步方法后面加【Sync】就行了
1.1 API結構圖 1.2 文件讀寫模式對應編碼 2、一些例子下面是部分API的例子,對部分API的一個簡單代碼實現
2.1 readFile讀取文件//readFile(filename,[options],callback); /** * filename, 必選參數,文件名 * [options],可選參數,可指定flag(文件操作選項,如r+ 讀寫;w+ 讀寫,文件不存在則創建)及encoding屬性 * callback 讀取文件后的回調函數,參數默認第一個err,第二個data 數據 */ const fs = require("fs"); fs.readFile("./package.json",{flag:"r+",encoding:"utf8"},(err,data)=>{ if(err) throw err; console.log(data); })2.2 writeFile寫文件
// fs.writeFile(filename,data,[options],callback); /** * filename, 必選參數,文件名 * data, 寫入的數據,可以字符或一個Buffer對象 * [options],flag,mode(權限),encoding * callback 讀取文件后的回調函數,參數默認第一個err,第二個data 數據 */ const fs = require("fs"); const data="hello world"; const bf=Buffer.from(data); //buffer寫入 fs.writeFile("./test.txt",bf,err=>{ if(err) throw err; console.log("寫入成功"); }) //字符寫入 fs.writeFile("./test.txt",data,err=>{ if(err) throw err; console.log("寫入成功"); })2.3 以追加方式寫文件
// fs.appendFile(filename,data,[options],callback); const fs = require("fs"); const data = " hello world"; const bf = Buffer.from(data); //buffer fs.appendFile("./test.txt", bf, err => { if (err) throw err; console.log("追加成功"); }) fs.appendFile("./test.txt", data, err => { if (err) throw err; console.log("追加成功"); })2.4 open打開文件
打開文件,獲取文件描述
// fs.open(filename, flags, [mode], callback); /** * filename, 必選參數,文件名 * flags, 操作標識,如"r",讀方式打開 * [mode],權限,如777,表示任何用戶讀寫可執行 * callback 打開文件后回調函數,參數默認第一個err,第二個fd為一個整數,表示打開文件返回的文件描述符,window中又稱文件句柄 */ const fs = require("fs"); fs.open("./test.txt","r",0666,(err,fd)=>{ if(err) throw err; console.log(fd); //3 })
【0666】為【文件權限碼】,也可以在【fs.constants】中輸出
2.5 讀文件,讀取打開的文件內容到緩沖區中//fs.read(fd, buffer, offset, length, position, callback); /** * fd, 使用fs.open打開成功后返回的文件描述符 * buffer, 一個Buffer對象,v8引擎分配的一段內存 * offset, 整數,向緩存區中寫入時的初始位置,以字節為單位 * length, 整數,讀取文件的長度 * position, 整數,讀取文件初始位置;文件大小以字節為單位 * callback(err, bytesRead, buffer), 讀取執行完成后回調函數,bytesRead實際讀取字節數,被讀取的緩存區對象 */ const fs = require("fs"); fs.open("./test.txt", "r", (err, fd) => { if (err) throw err; let bf = Buffer.alloc(255); fs.read(fd,bf,0,9,0,(err,bytesRead,buffer)=>{ if(err) throw err; console.log(bytesRead); console.log(buffer.toString()); }) })2.6 寫文件,將緩沖區內數據寫入使用fs.open打開的文件
//fs.write(fd, buffer, offset, length, position, callback); /** * fd, 使用fs.open打開成功后返回的文件描述符 * buffer, 一個Buffer對象,v8引擎分配的一段內存 * offset, 整數,從緩存區中讀取時的初始位置,以字節為單位 * length, 整數,從緩存區中讀取數據的字節數 * position, 整數,寫入文件初始位置; * callback(err, written, buffer), 寫入操作執行完成后回調函數,written實際寫入字節數,buffer被讀取的緩存區對象 */ const fs = require("fs"); fs.open("./test.txt", "w", (err, fd) => { if (err) throw err; let bf = Buffer.from(" 寫入文件數據的內容"); fs.write(fd, bf, 0, bf.length, 0, (err, bytesWritten, buffer) => { if (err) throw err; console.log(bytesWritten); console.log(`寫入的內容:${buffer.toString()}`); }) })2.7 刷新緩存區
使用fs.write寫入文件時,操作系統是將數據讀到內存,再把數據寫入到文件中,當數據讀完時并不代表數據已經寫完,因為有一部分還可能在內在緩沖區內。
因此可以使用fs.fsync方法將內存中數據寫入文件;--刷新內存緩沖區;
//fs.fsync(fd, [callback]) /** * fd, 使用fs.open打開成功后返回的文件描述符 * [callback(err, written, buffer)], 寫入操作執行完成后回調函數,written實際寫入字節數,buffer被讀取的緩存區對象 */ const fs = require("fs"); fs.open("./test.txt", "a+", (err, fd) => { if (err) throw err; let bf = Buffer.from(" I love Node"); fs.write(fd, bf, 0, bf.length, 0, (err, bytesWritten, buffer) => { if (err) throw err; fs.fsync(fd,(err)=>{}); fs.close(fd,err=>{}); }) })2.8 讀取目錄
//使用fs.readdir讀取目錄,重點其回調函數中files對象 //fs.readdir(path, callback); /** * path, 要讀取目錄的完整路徑及目錄名; * [callback(err, files)], 讀完目錄回調函數;err錯誤對象,files數組,存放讀取到的目錄中的所有文件名 */ const fs = require("fs"), path = require("path"); fs.readdir(__dirname + "/../11文件系統fs", (err, files) => { if (err) throw err; files.forEach(file => { let filePath = path.normalize(__dirname + "/" + file); fs.stat(filePath, (err, stats) => { if (stats.isFile()) { console.log(filePath + " is: " + "file"); } if (stats.isDirectory()) { console.log(filePath + " is: " + "dir"); } }) }) })3、流操作 3.1 創建讀取流
//fs.createReadStream(path, [options]) /** * path 文件路徑 * [options] flags:指定文件操作,默認"r",讀操作;encoding,指定讀取流編碼;autoClose, 是否讀取完成后自動關閉,默認true;start指定文件開始讀取位置;end指定文件開始讀結束位置 */ const fs = require("fs"); const rs = fs.createReadStream("./package.json", { flags: "r" }); rs.on("open", fd => console.log("開始讀取文件")); rs.on("data", data => { console.log(data.toString()); }) rs.on("end", function () { console.log("讀取文件結束") }); rs.on("close", function () { console.log("文件關閉"); }); rs.on("error", function (err) { console.error(err); });3.2 創建寫入流
//fs.createWriteStream(path, [options]) /** * path 文件路徑 * [options] flags:指定文件操作,默認"w",;encoding,指定讀取流編碼;start指定寫入文件的位置 */ /* ws.write(chunk, [encoding], [callback]); * chunk, 可以為Buffer對象或一個字符串,要寫入的數據 * [encoding], 編碼 * [callback], 寫入后回調 */ /* ws.end([chunk], [encoding], [callback]); * [chunk], 要寫入的數據 * [encoding], 編碼 * [callback], 寫入后回調 */ const fs = require("fs"); const ws=fs.createWriteStream("./test.txt",{flags:"w"}) const bf=Buffer.from("I Love Node"); ws.on("open", function () { console.log("文件流開啟") }); ws.on("close", function () { console.log("文件流關閉"); }); ws.on("error", function (err) { console.error(err); }); ws.write(bf,"utf8",(err,buffer)=>{ console.log("寫入完成") }) ws.end(" Bye");3.3 使用流復制文件
流復制文件就是創建一個讀取流和一個寫入流,將讀取流中的流出的數據用寫入流進行寫入
//使用流復制文件 const fs = require("fs"); const rs = fs.createReadStream("./package.json"); const ws = fs.createWriteStream("./package1.json"); rs.on("data", data => { ws.write(data); }) ws.on("open", function (fd) { console.log("要寫入的數據文件已經打開,文件描述符是: " + fd); }); rs.on("end",()=>{ console.log("文件讀取完成"); ws.end("完成",()=>{ console.log("文件寫入完成"); }) })
關于WriteStream對象的write方法返回一個布爾類型,當緩存區中數據全部寫滿時,返回false;表示緩存區已經寫滿,并將立即輸出到目標對象中。
一個例子測試返回值:
const fs = require("fs"); var ws = fs.createWriteStream(__dirname + "/test.txt",{flags:"w"}); for (var i = 0; i < 10000; i++) { var w_flag = ws.write(i.toString()); //當緩存區寫滿時,輸出false console.log(w_flag); }
一個例子當緩存區數據全部輸出時,觸發事件
const fs = require("fs"); const rs = fs.createReadStream("./ABoy.mp3"); const ws = fs.createWriteStream("./ABoy1.mp3"); rs.on("data", data => { let t = ws.write(data); if(!t){ console.log(t); } }) ws.on("drain", () => { console.log("系統緩存區數據已經全部輸出。") })3.4 pipe管道用于流
上面使用一個讀取流額一個寫入流進行了一次文件的復制,還有另外一種方式就是在寫入流和讀取流之間建立一條管道,是讀取流中的數據通過管道源源不斷的流向寫入流,實現文件的復制。
const fs = require("fs"); const rs = fs.createReadStream("./ABoy.mp3"); const ws = fs.createWriteStream("./ABoy1.mp3"); rs.pipe(ws); rs.on("data", function (data) { console.log("數據可讀") }); rs.on("end", function () { console.log("文件讀取完成"); }); ws.on("drain", () => { console.log("系統緩存區數據已經全部輸出。") }); ws.on("open", function (fd) { console.log("要寫入的數據文件已經打開,文件描述符是: " + fd); });
CSDN 【Node文件系統fs模塊】同步更新
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/88733.html
摘要:端輸入數據到端,對就是輸入流,得到的對象就是可讀流對就是輸出端得到的對象是可寫流。在中,這四種流都是的實例,它們都有事件,可讀流具有監聽數據到來的事件等,可寫流則具有監聽數據已傳給低層系統的事件等,和都同時實現了和的事件和接口。 原文地址在我的博客 node中的Buffer和Stream會給剛接觸Node的前端工程師們帶來困惑,原因是前端并沒有類似概念(or 有我們也沒意識到)。然而,...
摘要:回調函數提供兩個參數和,表示有沒有錯誤發生,是文件內容。文件關閉第一個參數文件時傳遞的文件描述符第二個參數回調函數回調函數有一個參數錯誤,關閉文件后執行。 showImg(//img.mukewang.com/5d3f890d0001836113660768.jpg); 人所缺乏的不是才干而是志向,不是成功的能力而是勤勞的意志。 —— 部爾衛 文章同步到github博客:https:/...
摘要:表示當前正在執行的腳本的文件名。默認編碼為模式為,為回調函數,回調函數只包含錯誤信息參數,在寫入失敗時返回。參數使用說明如下通過方法返回的文件描述符。 Node.js回調 Node.js異步編程的直接體現就是回調。 阻塞代碼: const fs = require(fs); let data = fs.readFileSync(input.txt); console.log(data...
摘要:為指定事件注冊一個監聽器,接受一個字符串和一個回調函數。發射事件,傳遞若干可選參數到事件監聽器的參數表。為指定事件注冊一個單次監聽器,即監聽器最多只會觸發一次,觸發后立刻解除該監聽器。 1.Node.js 簡介 Node.js 其實就是借助谷歌的 V8 引擎,將桌面端的 js 帶到了服務器端,它的出現我將其歸結為兩點: V8 引擎的出色; js 異步 io 與事件驅動給服務器帶來極高...
閱讀 1877·2021-09-22 15:29
閱讀 3356·2019-08-30 15:44
閱讀 3569·2019-08-30 15:43
閱讀 1767·2019-08-30 13:48
閱讀 1494·2019-08-29 13:56
閱讀 2481·2019-08-29 12:12
閱讀 975·2019-08-26 11:35
閱讀 1056·2019-08-26 10:25