前言
File System 模塊碍扔,字面翻譯就是文件系統(tǒng)肴沫,用于處理文件和文件流的,比如讀寫文件蕴忆、創(chuàng)建文件或文件夾颤芬、刪除文件、獲取文件信息等只要是涉及文件的操作,用它就可以滿足一切需求站蝠。
File System API 風格
使用 fs
(下同 File System)首先要在代碼中引用它:require('fs')
fs
提供了豐富的功能性方法汰具,且都可以通過異步或同步的方式來實現(xiàn),同步 API 的方法名一般都帶有 Sync
菱魔,請看下面的例子:
// 例子留荔,刪除一個文件
// 首先 require
const fs = require('fs');
try {
// 我是同步API,參數(shù)中沒有回調函數(shù)澜倦,同步API如果出錯了聚蝶,需要用 try / catch 捕獲異常
fs.unlinkSync('/tmp/hello');
console.log('successfully deleted /tmp/hello');
} catch (error) {
console.log(error);
}
// 我是異步API,參數(shù)中一般都有回調函數(shù)
fs.unlink('/tmp/hello', (err) => {
if (err) console.log(error);
else console.log('successfully deleted /tmp/hello');
});
文件的可讀流和可寫流
當我們“打開”文件時藻治,其實是打開了文件流碘勉,我們可以把它想象成一條河流,控制它流向其他地方桩卵;舉個例子验靡,當我們用編輯器打開一個 .txt
文件并在屏幕上看到文本內容時,其實就是一個流的過程雏节,從這個文本的文件流(可讀流)流向屏幕的標準輸出流(可寫流)胜嗓,請看下面的例子:
// 模擬流的過程,把當前文件的內容輸出到屏幕
const fs = require('fs');
// 創(chuàng)建當前文件的可讀流
const readFile = fs.createReadStream(__filename);
// 通過管道 pipe钩乍,文件的可讀流 -> 標準輸出
readFile.pipe(process.stdout);
把上述代碼保存到某一個文件中辞州,例如 copy.js
,然后執(zhí)行命令 node copy.js
就會看到我們期望的效果了寥粹。我們把難度提高孙技,實現(xiàn)一個復制文件的功能:
// 實現(xiàn)功能:把當前文件復制一份到當前目錄
const fs = require('fs');
const readFile = fs.createReadStream(__filename); // 創(chuàng)建當前文件的可讀流
const writeFile = fs.createWriteStream(`${__dirname}/newcopy.js`); // 創(chuàng)建新復制文件的可寫流
// readFile 打開時觸發(fā),fd是文件描述符
readFile.on('open', fd => {
console.log(' >>> readFile 文件流已經(jīng)打開排作!');
});
// readFile 關閉時觸發(fā)
readFile.on('close', () => {
console.log(' >>> readFile 文件流已經(jīng)關閉牵啦!');
});
// readFile 出錯時觸發(fā)
readFile.on('error', (err) => {
console.dir(err);
console.log('readFile 出錯啦!');
})
// 注釋同上
writeFile.on('open', fd => {
console.log(' >>> writeFile 文件流已經(jīng)打開妄痪!');
});
// 注釋同上
writeFile.on('close', () => {
console.log(' >>> writeFile 文件流已經(jīng)關閉哈雏!');
});
// 注釋同上
writeFile.on('error', (err) => {
console.dir(err);
console.log('writeFile 出錯啦!');
})
// 文件復制衫生,流:舊文件 -> 新文件
readFile.pipe(writeFile);
如何學習并使用相關的 API
fs
模塊提供了太多太多的 API裳瘪,我們不可能耗費大量的時間一個一個地學習,但我們有個小技巧可以猜出每個接口大概都是什么作用罪针,并快速找到我們所需要的 API彭羹,下面舉一些例子,讓大家不用看文檔說明就可以猜出這些 API 的功能:
-
fs.fchmod()
:字面上看泪酱,這個方法應該跟linux
的chmod
命令一樣派殷,所以這個方法肯定是處理文件權限的 -
fs.exsits()
:肯定是判斷文件是否存在的 -
fs.mkdir()
还最、fs.rmdir()
:肯定是創(chuàng)建和刪除文件夾的 -
fs.rename()
:肯定是修改文件名稱的
通過上面的判斷方法,我們就可以快速知道哪些 API 可以為我們所用毡惜。
實戰(zhàn)
接下來給大家一個實戰(zhàn)的項目拓轻,需求是這樣:根據(jù)文件夾的路徑參數(shù),我們的程序顯示出該文件夾下有哪些文件或文件夾经伙,并列出他們的名字:
const fs = require('fs');
const path = require('path');
// 獲取參數(shù)
const { argv } = process;
const param = argv[2] || '';
// 處理沒有參數(shù)得情況
if (!param) {
console.warn('請傳參數(shù)扶叉,例如:node fs.js C:\\Windows');
process.exit();
}
// 讀取文件夾
// files 是文件名
fs.readdir(param, (err, files) => {
if (err) console.dir(err); // 處理錯誤
else {
for (const f of files) {
const filePath = path.join(param, f); // 文件絕對路徑
try {
const fileStat = fs.statSync(filePath); // 文件狀態(tài)信息 stat
if (fileStat.isFile()) { // 文件
console.log('文件:', f);
} else if (fileStat.isDirectory()) { // 文件夾
console.log('文件夾:', f);
} else { // 其他格式
console.log('其他文件類型:', f);
}
} catch (error) { // 無法訪問的文件
console.log('該文件無法訪問:', f);
}
}
}
});
我們將上述代碼保存到 js 文件中,如 fs.js
帕膜,如果我們想查看 C:\Windows
目錄下的文件枣氧,就執(zhí)行命令:
# 如果想查看別的文件夾,就把 C:\Windows 替換成想查看的文件夾路徑
$ node fs.js C:\Windows\
- Node.js File System 官方文檔
- Node.js 文檔版本為: v8.11.1
簡書作者 小菜荔枝原創(chuàng) 轉載請聯(lián)系作者獲得授權