摘要:一個(gè)例子測(cè)試返回值當(dāng)緩存區(qū)寫滿時(shí),輸出一個(gè)例子當(dāng)緩存區(qū)數(shù)據(jù)全部輸出時(shí),觸發(fā)事件系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。數(shù)據(jù)可讀文件讀取完成系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。要寫入的數(shù)據(jù)文件已經(jīng)打開,文件描述符是文件系統(tǒng)模塊同步更新
環(huán)境:Node v8.2.1; Npm v5.3.0; OS Windows10
1、fs 模塊APInodejs的文件操作大部分API都提供了同步和異步的兩種方式,下面是異步API結(jié)構(gòu)圖,同步方法在異步方法后面加【Sync】就行了
1.1 API結(jié)構(gòu)圖 1.2 文件讀寫模式對(duì)應(yīng)編碼 2、一些例子下面是部分API的例子,對(duì)部分API的一個(gè)簡(jiǎn)單代碼實(shí)現(xiàn)
2.1 readFile讀取文件//readFile(filename,[options],callback); /** * filename, 必選參數(shù),文件名 * [options],可選參數(shù),可指定flag(文件操作選項(xiàng),如r+ 讀寫;w+ 讀寫,文件不存在則創(chuàng)建)及encoding屬性 * callback 讀取文件后的回調(diào)函數(shù),參數(shù)默認(rèn)第一個(gè)err,第二個(gè)data 數(shù)據(jù) */ 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, 必選參數(shù),文件名 * data, 寫入的數(shù)據(jù),可以字符或一個(gè)Buffer對(duì)象 * [options],flag,mode(權(quán)限),encoding * callback 讀取文件后的回調(diào)函數(shù),參數(shù)默認(rèn)第一個(gè)err,第二個(gè)data 數(shù)據(jù) */ 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, 必選參數(shù),文件名 * flags, 操作標(biāo)識(shí),如"r",讀方式打開 * [mode],權(quán)限,如777,表示任何用戶讀寫可執(zhí)行 * callback 打開文件后回調(diào)函數(shù),參數(shù)默認(rèn)第一個(gè)err,第二個(gè)fd為一個(gè)整數(shù),表示打開文件返回的文件描述符,window中又稱文件句柄 */ const fs = require("fs"); fs.open("./test.txt","r",0666,(err,fd)=>{ if(err) throw err; console.log(fd); //3 })
【0666】為【文件權(quán)限碼】,也可以在【fs.constants】中輸出
2.5 讀文件,讀取打開的文件內(nèi)容到緩沖區(qū)中//fs.read(fd, buffer, offset, length, position, callback); /** * fd, 使用fs.open打開成功后返回的文件描述符 * buffer, 一個(gè)Buffer對(duì)象,v8引擎分配的一段內(nèi)存 * offset, 整數(shù),向緩存區(qū)中寫入時(shí)的初始位置,以字節(jié)為單位 * length, 整數(shù),讀取文件的長(zhǎng)度 * position, 整數(shù),讀取文件初始位置;文件大小以字節(jié)為單位 * callback(err, bytesRead, buffer), 讀取執(zhí)行完成后回調(diào)函數(shù),bytesRead實(shí)際讀取字節(jié)數(shù),被讀取的緩存區(qū)對(duì)象 */ 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 寫文件,將緩沖區(qū)內(nèi)數(shù)據(jù)寫入使用fs.open打開的文件
//fs.write(fd, buffer, offset, length, position, callback); /** * fd, 使用fs.open打開成功后返回的文件描述符 * buffer, 一個(gè)Buffer對(duì)象,v8引擎分配的一段內(nèi)存 * offset, 整數(shù),從緩存區(qū)中讀取時(shí)的初始位置,以字節(jié)為單位 * length, 整數(shù),從緩存區(qū)中讀取數(shù)據(jù)的字節(jié)數(shù) * position, 整數(shù),寫入文件初始位置; * callback(err, written, buffer), 寫入操作執(zhí)行完成后回調(diào)函數(shù),written實(shí)際寫入字節(jié)數(shù),buffer被讀取的緩存區(qū)對(duì)象 */ const fs = require("fs"); fs.open("./test.txt", "w", (err, fd) => { if (err) throw err; let bf = Buffer.from(" 寫入文件數(shù)據(jù)的內(nèi)容"); fs.write(fd, bf, 0, bf.length, 0, (err, bytesWritten, buffer) => { if (err) throw err; console.log(bytesWritten); console.log(`寫入的內(nèi)容:${buffer.toString()}`); }) })2.7 刷新緩存區(qū)
使用fs.write寫入文件時(shí),操作系統(tǒng)是將數(shù)據(jù)讀到內(nèi)存,再把數(shù)據(jù)寫入到文件中,當(dāng)數(shù)據(jù)讀完時(shí)并不代表數(shù)據(jù)已經(jīng)寫完,因?yàn)橛幸徊糠诌€可能在內(nèi)在緩沖區(qū)內(nèi)。
因此可以使用fs.fsync方法將內(nèi)存中數(shù)據(jù)寫入文件;--刷新內(nèi)存緩沖區(qū);
//fs.fsync(fd, [callback]) /** * fd, 使用fs.open打開成功后返回的文件描述符 * [callback(err, written, buffer)], 寫入操作執(zhí)行完成后回調(diào)函數(shù),written實(shí)際寫入字節(jié)數(shù),buffer被讀取的緩存區(qū)對(duì)象 */ 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讀取目錄,重點(diǎn)其回調(diào)函數(shù)中files對(duì)象 //fs.readdir(path, callback); /** * path, 要讀取目錄的完整路徑及目錄名; * [callback(err, files)], 讀完目錄回調(diào)函數(shù);err錯(cuò)誤對(duì)象,files數(shù)組,存放讀取到的目錄中的所有文件名 */ const fs = require("fs"), path = require("path"); fs.readdir(__dirname + "/../11文件系統(tǒng)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 創(chuàng)建讀取流
//fs.createReadStream(path, [options]) /** * path 文件路徑 * [options] flags:指定文件操作,默認(rèn)"r",讀操作;encoding,指定讀取流編碼;autoClose, 是否讀取完成后自動(dòng)關(guān)閉,默認(rèn)true;start指定文件開始讀取位置;end指定文件開始讀結(jié)束位置 */ 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("讀取文件結(jié)束") }); rs.on("close", function () { console.log("文件關(guān)閉"); }); rs.on("error", function (err) { console.error(err); });3.2 創(chuàng)建寫入流
//fs.createWriteStream(path, [options]) /** * path 文件路徑 * [options] flags:指定文件操作,默認(rèn)"w",;encoding,指定讀取流編碼;start指定寫入文件的位置 */ /* ws.write(chunk, [encoding], [callback]); * chunk, 可以為Buffer對(duì)象或一個(gè)字符串,要寫入的數(shù)據(jù) * [encoding], 編碼 * [callback], 寫入后回調(diào) */ /* ws.end([chunk], [encoding], [callback]); * [chunk], 要寫入的數(shù)據(jù) * [encoding], 編碼 * [callback], 寫入后回調(diào) */ 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("文件流關(guān)閉"); }); ws.on("error", function (err) { console.error(err); }); ws.write(bf,"utf8",(err,buffer)=>{ console.log("寫入完成") }) ws.end(" Bye");3.3 使用流復(fù)制文件
流復(fù)制文件就是創(chuàng)建一個(gè)讀取流和一個(gè)寫入流,將讀取流中的流出的數(shù)據(jù)用寫入流進(jìn)行寫入
//使用流復(fù)制文件 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("要寫入的數(shù)據(jù)文件已經(jīng)打開,文件描述符是: " + fd); }); rs.on("end",()=>{ console.log("文件讀取完成"); ws.end("完成",()=>{ console.log("文件寫入完成"); }) })
關(guān)于WriteStream對(duì)象的write方法返回一個(gè)布爾類型,當(dāng)緩存區(qū)中數(shù)據(jù)全部寫滿時(shí),返回false;表示緩存區(qū)已經(jīng)寫滿,并將立即輸出到目標(biāo)對(duì)象中。
一個(gè)例子測(cè)試返回值:
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()); //當(dāng)緩存區(qū)寫滿時(shí),輸出false console.log(w_flag); }
一個(gè)例子當(dāng)緩存區(qū)數(shù)據(jù)全部輸出時(shí),觸發(fā)事件
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("系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。") })3.4 pipe管道用于流
上面使用一個(gè)讀取流額一個(gè)寫入流進(jìn)行了一次文件的復(fù)制,還有另外一種方式就是在寫入流和讀取流之間建立一條管道,是讀取流中的數(shù)據(jù)通過管道源源不斷的流向?qū)懭肓?,?shí)現(xiàn)文件的復(fù)制。
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("數(shù)據(jù)可讀") }); rs.on("end", function () { console.log("文件讀取完成"); }); ws.on("drain", () => { console.log("系統(tǒng)緩存區(qū)數(shù)據(jù)已經(jīng)全部輸出。") }); ws.on("open", function (fd) { console.log("要寫入的數(shù)據(jù)文件已經(jīng)打開,文件描述符是: " + fd); });
CSDN 【Node文件系統(tǒng)fs模塊】同步更新
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88733.html
摘要:端輸入數(shù)據(jù)到端,對(duì)就是輸入流,得到的對(duì)象就是可讀流對(duì)就是輸出端得到的對(duì)象是可寫流。在中,這四種流都是的實(shí)例,它們都有事件,可讀流具有監(jiān)聽數(shù)據(jù)到來的事件等,可寫流則具有監(jiān)聽數(shù)據(jù)已傳給低層系統(tǒng)的事件等,和都同時(shí)實(shí)現(xiàn)了和的事件和接口。 原文地址在我的博客 node中的Buffer和Stream會(huì)給剛接觸Node的前端工程師們帶來困惑,原因是前端并沒有類似概念(or 有我們也沒意識(shí)到)。然而,...
摘要:回調(diào)函數(shù)提供兩個(gè)參數(shù)和,表示有沒有錯(cuò)誤發(fā)生,是文件內(nèi)容。文件關(guān)閉第一個(gè)參數(shù)文件時(shí)傳遞的文件描述符第二個(gè)參數(shù)回調(diào)函數(shù)回調(diào)函數(shù)有一個(gè)參數(shù)錯(cuò)誤,關(guān)閉文件后執(zhí)行。 showImg(//img.mukewang.com/5d3f890d0001836113660768.jpg); 人所缺乏的不是才干而是志向,不是成功的能力而是勤勞的意志。 —— 部爾衛(wèi) 文章同步到github博客:https:/...
摘要:表示當(dāng)前正在執(zhí)行的腳本的文件名。默認(rèn)編碼為模式為,為回調(diào)函數(shù),回調(diào)函數(shù)只包含錯(cuò)誤信息參數(shù),在寫入失敗時(shí)返回。參數(shù)使用說明如下通過方法返回的文件描述符。 Node.js回調(diào) Node.js異步編程的直接體現(xiàn)就是回調(diào)。 阻塞代碼: const fs = require(fs); let data = fs.readFileSync(input.txt); console.log(data...
摘要:既然這樣,怎么理解中的單線程再捋一捋和的關(guān)系。在線程上,不會(huì)等待操作完成,繼續(xù)執(zhí)行后續(xù)的代碼。這就是單線程異步。在中除了代碼,一切都是并行的由于中主任務(wù)的執(zhí)行是以單線程的方式進(jìn)行,如果程序出錯(cuò)導(dǎo)致崩潰,就會(huì)終止整個(gè)流程。 node是什么 Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。 Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O 的模...
摘要:為指定事件注冊(cè)一個(gè)監(jiān)聽器,接受一個(gè)字符串和一個(gè)回調(diào)函數(shù)。發(fā)射事件,傳遞若干可選參數(shù)到事件監(jiān)聽器的參數(shù)表。為指定事件注冊(cè)一個(gè)單次監(jiān)聽器,即監(jiān)聽器最多只會(huì)觸發(fā)一次,觸發(fā)后立刻解除該監(jiān)聽器。 1.Node.js 簡(jiǎn)介 Node.js 其實(shí)就是借助谷歌的 V8 引擎,將桌面端的 js 帶到了服務(wù)器端,它的出現(xiàn)我將其歸結(jié)為兩點(diǎn): V8 引擎的出色; js 異步 io 與事件驅(qū)動(dòng)給服務(wù)器帶來極高...
閱讀 1884·2021-09-22 15:29
閱讀 3361·2019-08-30 15:44
閱讀 3570·2019-08-30 15:43
閱讀 1769·2019-08-30 13:48
閱讀 1497·2019-08-29 13:56
閱讀 2483·2019-08-29 12:12
閱讀 977·2019-08-26 11:35
閱讀 1059·2019-08-26 10:25