Node學(xué)習(xí)(8)--文件系統(tǒng)

Node.js 文件系統(tǒng)

Node 導(dǎo)入文件系統(tǒng)模塊(fs)語法如下所示:
var fs = require("fs")

異步和同步

Node.js 文件系統(tǒng)(fs 模塊)模塊中的方法均有異步和同步版本硬梁,
例如讀取文件內(nèi)容的函數(shù)有異步的 fs.readFile() 和同步的 fs.readFileSync()辟躏。
異步的方法函數(shù)最后一個參數(shù)為回調(diào)函數(shù)户魏,回調(diào)函數(shù)的第一個參數(shù)包含了錯誤信息(error)典挑。
建議用異步方法欢伏,比起同步,異步方法性能更高澎语,速度更快坑匠,而且沒有阻塞。

實(shí)例

創(chuàng)建 input.txt 文件雨让,內(nèi)容如下:hello
文件讀取實(shí)例
創(chuàng)建 file.js 文件, 代碼如下:

var fs = require("fs");

// 異步讀取
fs.readFile('input.txt', function (err, data) {
   if (err) {
       return console.error(err);
   }
   console.log("異步讀取: " + data.toString());
});

// 同步讀取
var data = fs.readFileSync('input.txt');
console.log("同步讀取: " + data.toString());

console.log("程序執(zhí)行完畢雇盖。");

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
同步讀取: hello
文件讀取實(shí)例

程序執(zhí)行完畢。
異步讀取: hello
文件讀取實(shí)例

打開文件

語法

以下為在異步模式下打開文件的語法格式:fs.open(path, flags[, mode], callback)

參數(shù)

參數(shù)使用說明如下:
path - 文件的路徑栖忠。
flags - 文件打開的行為崔挖。
mode - 設(shè)置文件模式(權(quán)限)贸街,文件創(chuàng)建默認(rèn)權(quán)限為 0666(可讀,可寫)狸相。
callback - 回調(diào)函數(shù)匾浪,帶有兩個參數(shù)如:callback(err, fd)。

flags 參數(shù)可以是以下值:

  1. r 以讀取模式打開文件卷哩。如果文件不存在拋出異常蛋辈。
  2. r+ 以讀寫模式打開文件。如果文件不存在拋出異常将谊。
  3. rs 以同步的方式讀取文件冷溶。
  4. rs+ 以同步的方式讀取和寫入文件。
  5. w 以寫入模式打開文件尊浓,如果文件不存在則創(chuàng)建逞频。
  6. wx 類似 'w',但是如果文件路徑存在栋齿,則文件寫入失敗苗胀。
  7. w+ 以讀寫模式打開文件,如果文件不存在則創(chuàng)建瓦堵。
  8. wx+ 類似 'w+'基协, 但是如果文件路徑存在,則文件讀寫失敗菇用。
  9. a 以追加模式打開文件澜驮,如果文件不存在則創(chuàng)建。
  10. ax 類似 'a'惋鸥, 但是如果文件路徑存在杂穷,則文件追加失敗。
  11. a+ 以讀取追加模式打開文件卦绣,如果文件不存在則創(chuàng)建耐量。
  12. ax+ 類似 'a+', 但是如果文件路徑存在滤港,則文件讀取追加失敗廊蜒。

實(shí)例

接下來我們創(chuàng)建 file.js 文件,并打開 input.txt 文件進(jìn)行讀寫蜗搔,代碼如下所示:

var fs = require("fs");

// 異步打開文件
console.log("準(zhǔn)備打開文件劲藐!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("文件打開成功八堡!");     
});

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
準(zhǔn)備打開文件樟凄!
文件打開成功!

獲取文件信息

語法

以下為通過異步模式獲取文件信息的語法格式:fs.stat(path, callback)

參數(shù)

參數(shù)使用說明如下:
path - 文件路徑兄渺。
callback - 回調(diào)函數(shù)缝龄,帶有兩個參數(shù)如:(err, stats), stats 是 fs.Stats 對象。
fs.stat(path)執(zhí)行后,會將stats類的實(shí)例返回給其回調(diào)函數(shù)叔壤∠顾牵可以通過stats類中的提供方法判斷文件的相關(guān)屬性。例如判斷是否為文件:

var fs = require('fs');

fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) {
    console.log(stats.isFile());         //true
})

stats類中的方法有:

  1. stats.isFile() 如果是文件返回 true炼绘,否則返回 false嗅战。
  2. stats.isDirectory() 如果是目錄返回 true,否則返回 false俺亮。
  3. stats.isBlockDevice() 如果是塊設(shè)備返回 true驮捍,否則返回 false。
  4. stats.isCharacterDevice() 如果是字符設(shè)備返回 true脚曾,否則返回 false东且。
  5. stats.isSymbolicLink() 如果是軟鏈接返回 true,否則返回 false本讥。
  6. stats.isFIFO() 如果是FIFO珊泳,返回true,否則返回 false拷沸。FIFO是UNIX中的一種特殊類型的命令管道色查。
  7. stats.isSocket() 如果是 Socket 返回 true,否則返回 false撞芍。

實(shí)例

接下來我們創(chuàng)建 file.js 文件综慎,代碼如下所示:

var fs = require("fs");

console.log("準(zhǔn)備打開文件!");
fs.stat('input.txt', function (err, stats) {
   if (err) {
       return console.error(err);
   }
   console.log(stats);
   console.log("讀取文件信息成功勤庐!");
   
   // 檢測文件類型
   console.log("是否為文件(isFile) ? " + stats.isFile());
   console.log("是否為目錄(isDirectory) ? " + stats.isDirectory());    
});

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
準(zhǔn)備打開文件示惊!
{ dev: 16777220,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 40333161,
  size: 61,
  blocks: 8,
  atime: Mon Sep 07 2015 17:43:55 GMT+0800 (CST),
  mtime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST),
  ctime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST) }
讀取文件信息成功!
是否為文件(isFile) ? true
是否為目錄(isDirectory) ? false

寫入文件

語法

以下為異步模式下寫入文件的語法格式:fs.writeFile(file, data[, options], callback)
如果文件存在愉镰,該方法寫入的內(nèi)容會覆蓋舊的文件內(nèi)容米罚。

參數(shù)

參數(shù)使用說明如下:
file - 文件名或文件描述符。
data - 要寫入文件的數(shù)據(jù)丈探,可以是 String(字符串) 或 Buffer(流) 對象录择。
options - 該參數(shù)是一個對象,包含 {encoding, mode, flag}碗降。默認(rèn)編碼為 utf8, 模式為 0666 隘竭, flag 為 'w'
callback - 回調(diào)函數(shù),回調(diào)函數(shù)只包含錯誤信息參數(shù)(err)讼渊,在寫入失敗時返回动看。

實(shí)例

接下來我們創(chuàng)建 file.js 文件,代碼如下所示:

var fs = require("fs");

console.log("準(zhǔn)備寫入文件");
fs.writeFile('input.txt', '我是通過寫入的文件內(nèi)容爪幻!',  function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("數(shù)據(jù)寫入成功菱皆!");
   console.log("--------我是分割線-------------")
   console.log("讀取寫入的數(shù)據(jù)须误!");
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("異步讀取文件數(shù)據(jù): " + data.toString());
   });
});

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
準(zhǔn)備寫入文件
數(shù)據(jù)寫入成功!
--------我是分割線-------------
讀取寫入的數(shù)據(jù)仇轻!
異步讀取文件數(shù)據(jù): 我是通過寫入的文件內(nèi)容

讀取文件

語法

以下為異步模式下讀取文件的語法格式:fs.read(fd, buffer, offset, length, position, callback)
該方法使用了文件描述符來讀取文件京痢。

參數(shù)

參數(shù)使用說明如下:
fd - 通過 fs.open() 方法返回的文件描述符。
buffer - 數(shù)據(jù)寫入的緩沖區(qū)篷店。
offset - 緩沖區(qū)寫入的寫入偏移量祭椰。
length - 要從文件中讀取的字節(jié)數(shù)。
position - 文件讀取的起始位置疲陕,如果 position 的值為 null吭产,則會從當(dāng)前文件指針的位置讀取。
callback - 回調(diào)函數(shù)鸭轮,有三個參數(shù)err, bytesRead, buffer臣淤,err 為錯誤信息, bytesRead 表示讀取的字節(jié)數(shù)窃爷,buffer 為緩沖區(qū)對象邑蒋。

實(shí)例

input.txt 文件內(nèi)容為:hello
接下來我們創(chuàng)建 file.js 文件,代碼如下所示:

var fs = require("fs");
var buf = new Buffer(1024);

console.log("準(zhǔn)備打開已存在的文件按厘!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打開成功医吊!");
   console.log("準(zhǔn)備讀取文件:");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + "  字節(jié)被讀取");
      
      // 僅輸出讀取的字節(jié)
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
準(zhǔn)備打開已存在的文件!
文件打開成功逮京!
準(zhǔn)備讀取文件:
42  字節(jié)被讀取
hello

關(guān)閉文件

語法

以下為異步模式下關(guān)閉文件的語法格式:fs.close(fd, callback)
該方法使用了文件描述符來讀取文件卿堂。

參數(shù)

參數(shù)使用說明如下:
fd - 通過 fs.open() 方法返回的文件描述符。
callback - 回調(diào)函數(shù)懒棉,沒有參數(shù)草描。

實(shí)例

input.txt 文件內(nèi)容為:hello
接下來我們創(chuàng)建 file.js 文件,代碼如下所示:

var fs = require("fs");
var buf = new Buffer(1024);

console.log("準(zhǔn)備打開文件策严!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打開成功穗慕!");
   console.log("準(zhǔn)備讀取文件!");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }

      // 僅輸出讀取的字節(jié)
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }

      // 關(guān)閉文件
      fs.close(fd, function(err){
         if (err){
            console.log(err);
         } 
         console.log("文件關(guān)閉成功");
      });
   });
});

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
準(zhǔn)備打開文件妻导!
文件打開成功逛绵!
準(zhǔn)備讀取文件!
hello
文件關(guān)閉成功

截取文件

語法

以下為異步模式下截取文件的語法格式:fs.ftruncate(fd, len, callback)
該方法使用了文件描述符來讀取文件倔韭。

參數(shù)

參數(shù)使用說明如下:
fd - 通過 fs.open() 方法返回的文件描述符术浪。
len - 文件內(nèi)容截取的長度。
callback - 回調(diào)函數(shù)寿酌,沒有參數(shù)胰苏。

實(shí)例

input.txt 文件內(nèi)容為:site:hello
接下來我們創(chuàng)建 file.js 文件,代碼如下所示:

var fs = require("fs");
var buf = new Buffer(1024);

console.log("準(zhǔn)備打開文件份名!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打開成功碟联!");
   console.log("截取10字節(jié)后的文件內(nèi)容妓美。");
   
   // 截取文件
   fs.ftruncate(fd, 10, function(err){
      if (err){
         console.log(err);
      } 
      console.log("文件截取成功僵腺。");
      console.log("讀取相同的文件"); 
      fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
         if (err){
            console.log(err);
         }

         // 僅輸出讀取的字節(jié)
         if(bytes > 0){
            console.log(buf.slice(0, bytes).toString());
         }

         // 關(guān)閉文件
         fs.close(fd, function(err){
            if (err){
               console.log(err);
            } 
            console.log("文件關(guān)閉成功鲤孵!");
         });
      });
   });
});

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
準(zhǔn)備打開文件!
文件打開成功辰如!
截取10字節(jié)后的文件內(nèi)容普监。
文件截取成功。
讀取相同的文件
site:www.r
文件關(guān)閉成功

刪除文件

語法

以下為刪除文件的語法格式:fs.unlink(path, callback)

參數(shù)

參數(shù)使用說明如下:
path - 文件路徑琉兜。
callback - 回調(diào)函數(shù)凯正,沒有參數(shù)。

實(shí)例

input.txt 文件內(nèi)容為:site:hello
接下來我們創(chuàng)建 file.js 文件豌蟋,代碼如下所示:

var fs = require("fs");

console.log("準(zhǔn)備刪除文件廊散!");
fs.unlink('input.txt', function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("文件刪除成功!");
});

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
準(zhǔn)備刪除文件梧疲!
文件刪除成功允睹!

再去查看 input.txt 文件,發(fā)現(xiàn)已經(jīng)不存在了幌氮。

創(chuàng)建目錄

語法

以下為創(chuàng)建目錄的語法格式:fs.mkdir(path[, mode], callback)

參數(shù)

參數(shù)使用說明如下:
path - 文件路徑缭受。
mode - 設(shè)置目錄權(quán)限,默認(rèn)為 0777该互。
callback - 回調(diào)函數(shù)米者,沒有參數(shù)。

實(shí)例

接下來我們創(chuàng)建 file.js 文件宇智,代碼如下所示:

var fs = require("fs");

console.log("創(chuàng)建目錄 /tmp/test/");
fs.mkdir("/tmp/test/",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("目錄創(chuàng)建成功蔓搞。");
});

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
創(chuàng)建目錄 /tmp/test/
目錄創(chuàng)建成功。

讀取目錄

語法

以下為讀取目錄的語法格式:fs.readdir(path, callback)

參數(shù)

參數(shù)使用說明如下:
path - 文件路徑随橘。
callback - 回調(diào)函數(shù)败明,回調(diào)函數(shù)帶有兩個參數(shù)err, files,err 為錯誤信息太防,files 為 目錄下的文件數(shù)組列表妻顶。

實(shí)例

接下來我們創(chuàng)建 file.js 文件,代碼如下所示:

var fs = require("fs");

console.log("查看 /tmp 目錄");
fs.readdir("/tmp/",function(err, files){
   if (err) {
       return console.error(err);
   }
   files.forEach( function (file){
       console.log( file );
   });
});

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
查看 /tmp 目錄
input.out
output.out
test
test.txt

刪除目錄

語法

以下為刪除目錄的語法格式:fs.rmdir(path, callback)

參數(shù)

參數(shù)使用說明如下:
path - 文件路徑蜒车。
callback - 回調(diào)函數(shù)讳嘱,沒有參數(shù)。

實(shí)例

接下來我們創(chuàng)建 file.js 文件酿愧,代碼如下所示:

var fs = require("fs");
// 執(zhí)行前創(chuàng)建一個空的 /tmp/test 目錄
console.log("準(zhǔn)備刪除目錄 /tmp/test");
fs.rmdir("/tmp/test",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("讀取 /tmp 目錄");
   fs.readdir("/tmp/",function(err, files){
      if (err) {
          return console.error(err);
      }
      files.forEach( function (file){
          console.log( file );
      });
   });
});

以上代碼執(zhí)行結(jié)果如下:

$ node file.js 
準(zhǔn)備刪除目錄 /tmp/test
讀取 /tmp 目錄

參考自http://www.runoob.com/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沥潭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嬉挡,更是在濱河造成了極大的恐慌钝鸽,老刑警劉巖汇恤,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拔恰,居然都是意外死亡因谎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門颜懊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來财岔,“玉大人,你說我怎么就攤上這事河爹〗宠担” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵咸这,是天一觀的道長夷恍。 經(jīng)常有香客問我,道長媳维,這世上最難降的妖魔是什么酿雪? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮侨艾,結(jié)果婚禮上执虹,老公的妹妹穿的比我還像新娘。我一直安慰自己唠梨,他們只是感情好袋励,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著当叭,像睡著了一般茬故。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚁鳖,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天磺芭,我揣著相機(jī)與錄音,去河邊找鬼醉箕。 笑死钾腺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的讥裤。 我是一名探鬼主播放棒,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼己英!你這毒婦竟也來了间螟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厢破,沒想到半個月后荣瑟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摩泪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年笆焰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片加勤。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡仙辟,死狀恐怖同波,靈堂內(nèi)的尸體忽然破棺而出鳄梅,到底是詐尸還是另有隱情,我是刑警寧澤未檩,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布戴尸,位于F島的核電站,受9級特大地震影響冤狡,放射性物質(zhì)發(fā)生泄漏孙蒙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一悲雳、第九天 我趴在偏房一處隱蔽的房頂上張望挎峦。 院中可真熱鬧,春花似錦合瓢、人聲如沸坦胶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顿苇。三九已至,卻和暖如春税弃,著一層夾襖步出監(jiān)牢的瞬間纪岁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工则果, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幔翰,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓西壮,卻偏偏與公主長得像遗增,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茸时,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容