Node文件操作匯總實例詳解
前言
前兩天我們介紹了 Nodejs 中 I/O 的重要組成部分:Buffer對象
和 Stream流
,今天我們介紹 Nodejs 的文件系統(tǒng),包括文件和目錄的讀寫、刪除,以及監(jiān)聽文件和目錄的修改。
文件系統(tǒng)
Nodejs 內置的 fs模塊
可與文件系統(tǒng)進行交互,封裝了常規(guī)的 POSIX函數
。POSIX(Portable Operating System Interface,可移植操作系統(tǒng)接口)是UNIX系統(tǒng)的一個設計標準。fs模塊提供了多個操作目錄和文件的方法,大多會有同步和異步兩種版本。同步的方法名稱會以Sync為后綴。
目錄處理
fs模塊的 readdir()
方法可異步的讀取目錄內容。回調函數包含兩個參數,第一個是錯誤對象,第二個是一個包含文件名稱的數組,對應的同步方法是 readdirSync()
。在下面的示例中,當前目錄包含兩個文件,上一級目錄包含一個目錄名稱。
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()
等。
讀寫文件
在fs模塊中,可使用批量方法 readFile()
將文件內容一次性的加載到內存中,如下所示。
const fs = require('fs'); fs.readFile('./origin.txt', (err, buf) => { console.log(buf.toString()); //"hello Node.js" });
對應的寫入方法是 writeFile()
,如下所示。
fs.writeFile('./target.txt', 'hello Node.js', (err) => { if (err) throw err; console.log('文件已被保存'); });
?? 文件路徑、寫入內容和回調函數是必傳的參數。如果文件不存在,那么會自動創(chuàng)建。
當文件很大時,該方法會因V8內存不足而出現問題。此時可以改用之前提到的流式方法 createReadStream()
,分批次的讀取文件。
如下所示,每次只讀7個字節(jié)的內容。
const readable = fs.createReadStream('./origin.txt', {highWaterMark: 7}); readable.on("data", (chunk) => { /*************/ /* "hello N" /* "ode.js" /************/ console.log(chunk.toString()); });
通過管道方法 pipe()
將 origin.txt
中的內容寫入到 target.txt
中,如下所示,對于不存在的文件,也會自動創(chuàng)建。
const writable = fs.createWriteStream('./target.txt'); readable.pipe(writable);
文件描述
fs模塊的 stat()
方法可讀取文件的描述信息,如下所示。
fs.stat('./demo.txt', (err, stats) => { console.log(stats); });
回調函數中的stats參數是一個 fs.Stats對象
,其屬性如下所示。它還包含一些判斷方法,例如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() 等價,只是 fstat() 方法的第一個參數是文件描述符。在POSIX系統(tǒng)中,文件描述符是一個正整數,它實際上是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當打開或創(chuàng)建一個文件時,就會被分配一個文件描述符。
在下面的示例中,open()
方法的回調函數中包含一個 fd參數(即文件描述符)
,搭配 fstat() 方法就能讀取文件信息:
fs.open('./demo.txt', 'r', (err, fd) => { fs.fstat(fd, (err, stats) => { console.log(stats); }); });
監(jiān)控文件
fs模塊提供了兩種方法來監(jiān)控文件:watch()
和 watchFile()
,前者能監(jiān)控文件或目錄的更改,后者只能監(jiān)控文件的更改。
watch()
方法的監(jiān)聽器回調包含兩個參數,第一個是事件類型(包括rename和change),第二個是觸發(fā)事件的文件名稱,如下所示:
fs.watch('./demo.txt', (eventType, filename) => { console.log(eventType, filename); });
執(zhí)行node命令后,每次更改demo.txt文件,就會在控制臺打印出下面這條語句。
$ node index.js change demo.txt
雖然 watch()
方法的性能優(yōu)于 watchFile()
方法,但是 watch()
不是一個跨平臺的方法,其表現在各個平臺中并非百分百一致(例如filename參數不能保證提供),而 watchFile()
是跨平臺的。
異步文件
fs.promises
是 Nodejs 提供的一組備用的異步文件系統(tǒng)方法,它們會返回Promise對象而不是通過回調來處理結果。例如以Promise的方式使用 stat()
方法,如下所示。
const fsPromises = require('fs').promises; fsPromises.stat('./demo.txt').then(stats => { console.log(stats); });
刪除文件
Nodejs 中 fs模塊
提供了 unlink()
和 rm()
兩個方法來刪除文件。下面的代碼實現了刪除當前文件夾下的 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); } })
如果要刪除文件夾,可以使用 rmdir()
方法,用法同 rm()
方法一樣。
?? rm()
同時支持刪除目錄和文件,而 unlink()
只能用于刪除文件。
總結
fs模塊
提供了大量對文件的操作的API,你無需去全部記住他們,只需像在學習 Linux 時簡單記住那些基礎的命令即可:
fs.stat
讀取文件的描述信息fs.mkdir
創(chuàng)建目錄 (創(chuàng)建之前先判斷是否存在)fs.writeFile
寫入文件(文件不存在就創(chuàng)建,但不能創(chuàng)建目錄)fs.appendFile
寫入追加文件fs.readFile
讀取文件fs.readdir
讀取目錄fs.rename
重命名fs.rmdir
刪除目錄fs.unlink
和fs.rm
刪除文件
以上就是Node文件操作匯總實例詳解的詳細內容,更多關于Node文件操作匯總的資料請關注腳本之家其它相關文章!
相關文章
nodejs npm install全局安裝和本地安裝的區(qū)別
這篇文章主要介紹了nodejs npm install 全局安裝和非全局安裝的區(qū)別,即帶參數-g和不帶參數-g安裝的區(qū)別,需要的朋友可以參考下2014-06-06淺談Node.js CVE-2017-14849 漏洞分析(詳細步驟)
這篇文章主要介紹了淺談Node.js CVE-2017-14849 漏洞分析(詳細步驟),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11基于NodeJS+MongoDB+AngularJS+Bootstrap開發(fā)書店案例分析
這章的目的是為了把前面所學習的內容整合一下,這個示例完成一個簡單圖書管理模塊,因為中間需要使用到Bootstrap這里先介紹Bootstrap2017-01-01