1. 程式人生 > 程式設計 >node.js中fs檔案系統模組的使用方法例項詳解

node.js中fs檔案系統模組的使用方法例項詳解

本文例項講述了node.js中fs檔案系統模組的使用方法。分享給大家供大家參考,具體如下:

node.js中為我們提供了fs檔案系統模組,實現對檔案或目錄的建立,修改和刪除等操作。

fs模組中,所有的方法分為同步和非同步兩種實現。

有 sync 字尾的方法為同步方法,沒有 sync 字尾的方法為非同步方法。

一、檔案的整個讀取

const fs = require('fs');
//引數一表示讀取的檔案
//引數二表示讀取的配置,{encoding:'null',flag:'r'}
//encoding 表示編碼方式
//flag 表示檔案系統標誌
//如果沒有指定引數二中的encoding,則data返回的是一個Buffer
fs.readFile('./1.txt',function (err,data) {
  console.log(data);
});
//如果指定了,則data返回的是解析後的字串
fs.readFile('./1.txt',{'encoding': 'utf8','flag': 'r'},data) {
  console.log(data);
});

或同步讀取:

const fs = require('fs');
let data = fs.readFileSync('./1.txt');
console.log(data);
let data2 = fs.readFileSync('./1.txt',{'encoding': 'utf8'});
console.log(data2);

二、往檔案寫入資料

const fs = require('fs');
//引數一表示需要寫入的檔案
//引數二表示寫入的資料
//引數三表示寫入配置 {encoding:'utf8',mode:'0o666',flag:'w'}
//encoding 表示檔案編碼
//mode 表示檔案許可權
//flag 表示表示檔案系統標誌
fs.writeFile('./1.txt','資料',{'mode': 0o666,'flag': 'w'},function (err) {
  console.log(err);
});
//注意如果檔案已存在,預設會覆蓋寫入
fs.writeFile('./1.txt','你好',function (err) {
  console.log(err);
});
//如果想追加寫入,將flag設定為'a'就可以了。
fs.writeFile('./1.txt',{'flag': 'a'},function (err) {
  console.log(err);
});

注意,writeFile() 預設會以覆蓋的方式寫入資料。

或者同步寫入資料:

const fs = require('fs');
fs.writeFileSync('./1.txt','資料');

關於 mode 檔案許可權的說明:

在linux中檔案的許可權會為3種,4-表示可讀,2-表示可寫,1-表示可執行。它們之間的相互組合形成不同許可權。

對於檔案,有三個許可權分配,1:檔案所有者,2:檔案所屬組,3:其他使用者。

關於 flag 檔案系統標誌的說明:

r 表示 讀取
w 表示 寫入
s 表示 同步
a 表示 追加
x 表示 檔案存在就報錯
+ 表示 增加相反操作

r+ 與 w+ 區別,檔案不存在時,r+ 不會建立檔案,而 w+ 會建立。如果檔案存在 r+ 不會清空檔案,而 w+ 會清空檔案。

三、往檔案中追加資料

const fs = require('fs');
fs.appendFile('./1.txt',function (err) {
  console.log(err);
});
fs.appendFileSync('./1.txt','同步追加');

四、拷貝檔案

const fs = require('fs');
//引數一表示原始檔
//引數二表示目標檔案
//引數三表示拷貝操作的修飾符,預設0
//引數四表示回撥函式
fs.copyFile('./1.txt','./2.txt',function (err) {
  console.log(err);
});
//同步拷貝檔案
fs.copyFileSync('./1.txt','./3.txt');

五、開啟檔案,讀取檔案,寫入檔案

const fs = require('fs');
//引數一表示檔案路徑
//引數二表示檔案系統標誌
//引數三表示檔案許可權
//引數四表示回撥函式,err表示錯誤,fd表示檔案描述符,是一個整型
fs.open('./1.txt','r+',0o666,fd) {
  //建立一個3位元組的Buffer,用來接收資料
  let rbuf = Buffer.alloc(3);
  //引數一表示檔案描述符
  //引數二表示接收資料的Buffer
  //引數三表示往Buffer中寫入的偏移量
  //引數四表示讀取的位元組數
  //引數五表示從檔案中讀取的位置,如果為null,則是檔案的當前位置讀取
  //引數六表示回撥函式,err表示錯誤,bytesRead表示實際讀取的位元組,buffer表示接收資料的Buffer
  fs.read(fd,rbuf,3,bytesRead,buffer) {
    console.log(rbuf.toString());
    console.log(bytesRead);
  });
  let wbuf = Buffer.from('中國');
  //引數一表示檔案描述符
  //引數二表示寫入資料的Buffer
  //引數三表示往Buffer中讀取的偏移量
  //引數四表示寫入的位元組數
  //引數五表示從檔案中寫入的位置,如果不等於數字,則從檔案的當前位置寫入
  //引數六表示回撥函式,err表示錯誤,written表示實際寫入的位元組數,buffer表示寫入資料的Buffer
  fs.write(fd,wbuf,fs.stat,written,buffer) {
    console.log(written);
  });
});

六、同步磁碟快取,把緩衝區資料重新整理到檔案中。

const fs = require('fs');
fs.open('./1.txt','w+',fd) {
  let data = Buffer.from('資料\n');
  let task = [];
  //我們往檔案中迴圈寫入資料
  for (ix = 0; ix < 1000; ix++) {
    task.push(function () {
      return new Promise((resolve,reject) => {
        fs.write(fd,data,data.length,null,buffer) {
          if (err) {
            reject(err);
          } else {
            resolve(written);
          }
        });
      });
    });
  }
  Promise.all(task.map(fn => fn())).then(value => {
    console.log(value);
  },reason => {
    console.log(reason);
  });
  //當們寫完資料後,一般會強制重新整理緩衝區,讓資料寫入到檔案裡,然後關閉檔案。
  //因為系統為了效率,我們寫入的資料通常會放到一個緩衝區中,當緩衝區滿了後,系統就一次把資料寫到檔案。
  fs.fsync(fd,function (err) {
    console.log(err);
    //關閉檔案
    fs.close(fd,function (err) {
      console.log(err);
    })
  });
});

七、建立目錄

const fs = require('fs');
//建立目錄,預設情況下不支援遞迴建立目錄
fs.mkdir('./a',function (err) {
  console.log(err);
});
//通過設定引數二中的recursive為true,則可以遞迴建立目錄
fs.mkdir('./a/b/c',{'recursive': true},function (err) {
  console.log(err);
});

八、刪除目錄

const fs = require('fs');
//rmdir無法刪除非空目錄
fs.rmdir('./a',function (err) {
  console.log(err);
});

九、測試檔案或目錄是否存在,是否可讀,是否可寫

const fs = require('fs');
let path = './a';
//判斷是否存在
fs.access(path,fs.constants.F_OK,function (err) {
  console.log(err ? '不存在' : '存在');
});
//判斷是否可讀
fs.access(path,fs.constants.R_OK,function (err) {
  console.log(err ? '不可讀' : '可讀');
});
//判斷是否可寫
fs.access(path,fs.constants.W_OK,function (err) {
  console.log(err ? '不可寫' : '可寫');
});

十、讀取目錄下的所有檔案

const fs = require('fs');
const path = require('path');
//讀取目錄下所有檔案
fs.readdir('./a',files) {
  console.log(files);
});
//遞迴的讀取一個目錄所有檔案
function readDir(dir) {
  fs.stat(dir,stats) {
    if (stats.isDirectory()) {
      console.log(dir);
      fs.readdir(dir,files) {
        files.map(value => {
          let cur = path.join(dir,value);
          fs.stat(cur,stats) {
            if (stats.isDirectory()) {
              readDir(cur);
            } else {
              console.log(cur);
            }
          });
        });
      });
    } else {
      console.log(dir);
    }
  });
}
readDir('./node_modules');

十一、檢視檔案或目錄的詳細資訊

const fs = require('fs');
//獲取目錄詳細資訊
fs.stat('./a',stats) {
  console.log(stats);
});
//獲取檔案詳細資訊
fs.stat('./1.txt',stats) {
  console.log(stats);
});

  • stats.size 表示檔案大小。
  • stats.atime 表示檔案中的資料最後訪問時間。
  • stats.mtime 表示檔案中的內容修改最後時間。
  • stats.ctime 表示檔案許可權,擁有者,所屬組,連結數發生改變時的時間。
  • stats.birthtime 表示檔案建立時間。

十二、重新命名或移動檔案

const fs = require('fs');
//重新命名檔案
fs.rename('./1.txt','./b.txt',function (err) {
  console.log(err);
});
//移動檔案
fs.rename('./2.txt','./a/b/c/2.txt',function (err) {
  console.log(err);
});

十三、刪除檔案

const fs = require('fs');
//刪除檔案
fs.unlink('./3.txt',function (err) {
  console.log(err);
});

十四、擷取檔案

const fs = require('fs');
//擷取檔案成3個位元組
fs.truncate('./b.txt',function (err) {
  console.log(err);
});

十五、監視檔案或目錄的狀態改變

const fs = require('fs');
//監視目錄
fs.watchFile('./a',function (curr,prev) {
  console.log(curr);
  console.log(prev);
  if (curr.mtimeMs !== prev.mtimeMs) {
    console.log('內容發生的改變');
  }
});

希望本文所述對大家node.js程式設計有所幫助。