Node.js File System — 玩轉 Node.js 的文件系統(tǒng)

前言

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() :字面上看泪酱,這個方法應該跟 linuxchmod 命令一樣派殷,所以這個方法肯定是處理文件權限的
  • 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\  
運行結果

簡書作者 小菜荔枝原創(chuàng) 轉載請聯(lián)系作者獲得授權

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末垮刹,一起剝皮案震驚了整個濱河市达吞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌危纫,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乌庶,死亡現(xiàn)場離奇詭異种蝶,居然都是意外死亡,警方通過查閱死者的電腦和手機瞒大,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門螃征,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人透敌,你說我怎么就攤上這事盯滚。” “怎么了酗电?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵魄藕,是天一觀的道長。 經(jīng)常有香客問我撵术,道長背率,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任嫩与,我火速辦了婚禮寝姿,結果婚禮上,老公的妹妹穿的比我還像新娘划滋。我一直安慰自己饵筑,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布处坪。 她就那樣靜靜地躺著根资,像睡著了一般架专。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫂冻,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天胶征,我揣著相機與錄音,去河邊找鬼桨仿。 笑死睛低,一個胖子當著我的面吹牛,可吹牛的內容都是我干的服傍。 我是一名探鬼主播钱雷,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吹零!你這毒婦竟也來了罩抗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤灿椅,失蹤者是張志新(化名)和其女友劉穎套蒂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茫蛹,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡操刀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了婴洼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骨坑。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖柬采,靈堂內的尸體忽然破棺而出欢唾,到底是詐尸還是另有隱情,我是刑警寧澤粉捻,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布礁遣,位于F島的核電站,受9級特大地震影響肩刃,放射性物質發(fā)生泄漏亡脸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一树酪、第九天 我趴在偏房一處隱蔽的房頂上張望浅碾。 院中可真熱鬧,春花似錦续语、人聲如沸垂谢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滥朱。三九已至根暑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徙邻,已是汗流浹背排嫌。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缰犁,地道東北人淳地。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像帅容,于是被迫代替她去往敵國和親颇象。 傳聞我的和親對象是個殘疾皇子房待,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容