Node文件操作匯總實(shí)例詳解
前言
前兩天我們介紹了 Nodejs 中 I/O 的重要組成部分:Buffer對(duì)象 和 Stream流,今天我們介紹 Nodejs 的文件系統(tǒng),包括文件和目錄的讀寫(xiě)、刪除,以及監(jiān)聽(tīng)文件和目錄的修改。
文件系統(tǒng)
Nodejs 內(nèi)置的 fs模塊 可與文件系統(tǒng)進(jìn)行交互,封裝了常規(guī)的 POSIX函數(shù)。POSIX(Portable Operating System Interface,可移植操作系統(tǒng)接口)是UNIX系統(tǒng)的一個(gè)設(shè)計(jì)標(biāo)準(zhǔn)。fs模塊提供了多個(gè)操作目錄和文件的方法,大多會(huì)有同步和異步兩種版本。同步的方法名稱(chēng)會(huì)以Sync為后綴。
目錄處理
fs模塊的 readdir() 方法可異步的讀取目錄內(nèi)容。回調(diào)函數(shù)包含兩個(gè)參數(shù),第一個(gè)是錯(cuò)誤對(duì)象,第二個(gè)是一個(gè)包含文件名稱(chēng)的數(shù)組,對(duì)應(yīng)的同步方法是 readdirSync() 。在下面的示例中,當(dāng)前目錄包含兩個(gè)文件,上一級(jí)目錄包含一個(gè)目錄名稱(chēng)。
const fs = require('fs');
fs.readdir('./', (err, files) => {
console.log(files); //[ 'demo.txt', 'index.js' ]
});
fs.readdir('../', (err, files) => {
console.log(files); //[ '1' ]
});
其它處理目錄的方法還有 opendir()、mkdir() 等。
讀寫(xiě)文件
在fs模塊中,可使用批量方法 readFile() 將文件內(nèi)容一次性的加載到內(nèi)存中,如下所示。
const fs = require('fs');
fs.readFile('./origin.txt', (err, buf) => {
console.log(buf.toString()); //"hello Node.js"
});
對(duì)應(yīng)的寫(xiě)入方法是 writeFile() ,如下所示。
fs.writeFile('./target.txt', 'hello Node.js', (err) => {
if (err) throw err;
console.log('文件已被保存');
});
?? 文件路徑、寫(xiě)入內(nèi)容和回調(diào)函數(shù)是必傳的參數(shù)。如果文件不存在,那么會(huì)自動(dòng)創(chuàng)建。
當(dāng)文件很大時(shí),該方法會(huì)因V8內(nèi)存不足而出現(xiàn)問(wèn)題。此時(shí)可以改用之前提到的流式方法 createReadStream(),分批次的讀取文件。
如下所示,每次只讀7個(gè)字節(jié)的內(nèi)容。
const readable = fs.createReadStream('./origin.txt', {highWaterMark: 7});
readable.on("data", (chunk) => {
/*************/
/* "hello N"
/* "ode.js"
/************/
console.log(chunk.toString());
});
通過(guò)管道方法 pipe() 將 origin.txt 中的內(nèi)容寫(xiě)入到 target.txt 中,如下所示,對(duì)于不存在的文件,也會(huì)自動(dòng)創(chuàng)建。
const writable = fs.createWriteStream('./target.txt');
readable.pipe(writable);
文件描述
fs模塊的 stat() 方法可讀取文件的描述信息,如下所示。
fs.stat('./demo.txt', (err, stats) => {
console.log(stats);
});
回調(diào)函數(shù)中的stats參數(shù)是一個(gè) fs.Stats對(duì)象 ,其屬性如下所示。它還包含一些判斷方法,例如isDirectory()、isFile()等。
Stats {
dev: 195650,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: undefined,
ino: 36873221949682120,
size: 13,
blocks: undefined,
atimeMs: 1586227933993.0217,
mtimeMs: 1585882949091.0166,
ctimeMs: 1586227933995.0222,
birthtimeMs: 1586227933993.0217,
atime: 2020-04-07T02:52:13.993Z,
mtime: 2020-04-03T03:02:29.091Z,
ctime: 2020-04-07T02:52:13.995Z,
birthtime: 2020-04-07T02:52:13.993Z
}
fs模塊還提供了 fstat() 方法,在功能上與 stat() 等價(jià),只是 fstat() 方法的第一個(gè)參數(shù)是文件描述符。在POSIX系統(tǒng)中,文件描述符是一個(gè)正整數(shù),它實(shí)際上是一個(gè)索引值,指向內(nèi)核為每一個(gè)進(jìn)程所維護(hù)的該進(jìn)程打開(kāi)文件的記錄表。當(dāng)打開(kāi)或創(chuàng)建一個(gè)文件時(shí),就會(huì)被分配一個(gè)文件描述符。
在下面的示例中,open() 方法的回調(diào)函數(shù)中包含一個(gè) fd參數(shù)(即文件描述符),搭配 fstat() 方法就能讀取文件信息:
fs.open('./demo.txt', 'r', (err, fd) => {
fs.fstat(fd, (err, stats) => {
console.log(stats);
});
});
監(jiān)控文件
fs模塊提供了兩種方法來(lái)監(jiān)控文件:watch() 和 watchFile() ,前者能監(jiān)控文件或目錄的更改,后者只能監(jiān)控文件的更改。
watch() 方法的監(jiān)聽(tīng)器回調(diào)包含兩個(gè)參數(shù),第一個(gè)是事件類(lèi)型(包括rename和change),第二個(gè)是觸發(fā)事件的文件名稱(chēng),如下所示:
fs.watch('./demo.txt', (eventType, filename) => {
console.log(eventType, filename);
});
執(zhí)行node命令后,每次更改demo.txt文件,就會(huì)在控制臺(tái)打印出下面這條語(yǔ)句。
$ node index.js change demo.txt
雖然 watch() 方法的性能優(yōu)于 watchFile() 方法,但是 watch() 不是一個(gè)跨平臺(tái)的方法,其表現(xiàn)在各個(gè)平臺(tái)中并非百分百一致(例如filename參數(shù)不能保證提供),而 watchFile() 是跨平臺(tái)的。
異步文件
fs.promises 是 Nodejs 提供的一組備用的異步文件系統(tǒng)方法,它們會(huì)返回Promise對(duì)象而不是通過(guò)回調(diào)來(lái)處理結(jié)果。例如以Promise的方式使用 stat() 方法,如下所示。
const fsPromises = require('fs').promises;
fsPromises.stat('./demo.txt').then(stats => {
console.log(stats);
});
刪除文件
Nodejs 中 fs模塊 提供了 unlink() 和 rm() 兩個(gè)方法來(lái)刪除文件。下面的代碼實(shí)現(xiàn)了刪除當(dāng)前文件夾下的 toBeDel.txt 文件:
const fs = require('fs');
fs.unlink('./toBeDel.txt', (err) => {
if (!err) {
console.log(err);
}
});
// or
fs.rm('./toBeDel.txt', (err) => {
if (!err) {
console.log(err);
}
})
如果要?jiǎng)h除文件夾,可以使用 rmdir() 方法,用法同 rm() 方法一樣。
?? rm() 同時(shí)支持刪除目錄和文件,而 unlink() 只能用于刪除文件。
總結(jié)
fs模塊 提供了大量對(duì)文件的操作的API,你無(wú)需去全部記住他們,只需像在學(xué)習(xí) Linux 時(shí)簡(jiǎn)單記住那些基礎(chǔ)的命令即可:
fs.stat讀取文件的描述信息fs.mkdir創(chuàng)建目錄 (創(chuàng)建之前先判斷是否存在)fs.writeFile寫(xiě)入文件(文件不存在就創(chuàng)建,但不能創(chuàng)建目錄)fs.appendFile寫(xiě)入追加文件fs.readFile讀取文件fs.readdir讀取目錄fs.rename重命名fs.rmdir刪除目錄fs.unlink和fs.rm刪除文件
以上就是Node文件操作匯總實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于Node文件操作匯總的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
node.js中的buffer.length方法使用說(shuō)明
這篇文章主要介紹了node.js中的buffer.length方法使用說(shuō)明,本文介紹了buffer.length的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
Node.JS利用PhantomJs抓取網(wǎng)頁(yè)入門(mén)教程
現(xiàn)今,網(wǎng)頁(yè)抓取已經(jīng)是一種人所共知的技術(shù)了,然而依然存在著諸多復(fù)雜性,下面這篇文章主要給大家介紹了Node.JS利用PhantomJs抓取網(wǎng)頁(yè)的方法教程,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-05-05
Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法
這篇文章主要給大家介紹了在Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
在Express中提供靜態(tài)文件的實(shí)現(xiàn)方法
這篇文章主要介紹了在Express中提供靜態(tài)文件的實(shí)現(xiàn)方法,將包含靜態(tài)資源的目錄的名稱(chēng)傳遞給 express.static 中間件函數(shù),以便開(kāi)始直接提供這些文件,感興趣的可以了解一下2019-10-10
node?NPM庫(kù)promise?異步任務(wù)狀態(tài)管理
這篇文章主要介紹了node?NPM庫(kù)promise?異步任務(wù)狀態(tài)管理2023-07-07
Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請(qǐng)求的教程
Mock.js這個(gè)JavaScript庫(kù)最常見(jiàn)的用法便是被用來(lái)攔截AJAX請(qǐng)求,well,這里我們就來(lái)看一下Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請(qǐng)求的教程:2016-05-05
學(xué)習(xí) NodeJS 第八天:Socket 通訊實(shí)例
本篇文章主要介紹了學(xué)習(xí) NodeJS 第八天:Socket 通訊實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12
node.js中的console.log方法使用說(shuō)明
這篇文章主要介紹了node.js中的console.log方法使用說(shuō)明,本文介紹了console.log的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12

