NodeJs fs(文件系統簡單操做)

我的學習記錄,僅供參考

文件系統(File System)
文件系統簡單來講就是經過Node來操做系統中的文件
使用文件系統,須要先引入fs模塊,fs是核心模塊,直接引入 不須要下載
const fs = require('fs');

文件寫入

同步文件寫入

代碼逐條執行,會阻塞

操做步驟

打開文件
fs.openSync(path, flags[, mode]);
  • path 要打開文件的路徑
  • flags 打開文件要作的操做的類型html

    • r 只讀的
    • w 可寫的
  • mode 可選的 設置文件的操做設置權限 通常不會傳
  • 返回值:node

    • 該方法會返回一個文件的描述符 做爲結果 咱們能夠經過該描述符來對文件的各類操做
向文件中寫入內容
fs.writeSync(fd, string[, position[, encoding]]);
  • fd 文件的描述符 ,須要傳遞要寫入的文件的描述符
  • string 要寫入的內容
  • position 寫入的起始位置 //可選
  • encoding 寫入的編碼,默認utf-8 //可選
保存而且關閉文件
fs.closeSync(fd);
  • fd 要關閉文件的描述符

例子

//引入文件系統
const fs = require('fs');
//打開文件
var fd = fs.openSync('test.txt','w');
//向文件中寫入內容
fs.writeSync(fd,'重返十七歲');
//關閉文件
fs.closeSync(fd);

異步文件寫入

代碼會一塊兒執行不會阻塞

操做步驟

打開文件

fs.open(path, flags[, mode], callback);api

  • 異步調用的方法,結果都是經過回調函數的參數返回的數組

    • 回調函數有兩個參數:異步

      • err 錯誤對象 若是沒有錯誤則爲 null
      • fd 文件的描述符
寫入文件
fs.write(fd, string[, position[, encoding]], callback);
關閉文件
fs.close(fd, callback);

例子

//引入fs模塊
const fs = require('fs');
//打開文件
fs.open('test.txt','w',function (err,fd) {
    //判斷是否出錯
    if(!err){
        // 寫入文件
        fs.write(fd,"這是異步寫入的內容",function (err) {
            if(!err){
                console.log('寫入成功');
            }
            //關閉文件
            fs.close(fd, function (err) {
                if(!err){
                    console.log("文件已關閉");
                }
            });
        });
    }else {
        console.log(err);
    }
});

簡單文件寫入

fs.writeFile(file, data[, options], callback);//異步
fs.writeFileSync(file, data[, options]);//同步
  • file 要操做的文件的路徑
  • data 要寫入的數據
  • options 選項,能夠對寫入進行一些設置 (可選)函數

    • 操做符(flag):性能

      • r 只讀
      • w 可寫
      • a 追加
  • callback 回調函數,當咱們寫入完成之後執行的函數

例子

const fs = require('fs');
fs.writeFile('test.txt','經過writeFile寫入的內容',{flag:"a"},function (err) {
        if(!err){
            console.log("寫入成功");
        }
});

流式文件寫入

同步,異步,簡單文件的寫入都不適合大文件的寫入,性能較差,容易致使內存溢出,而流式文件寫入會 一點一點的寫入進去 不會致使內存溢出的情況學習

引入文件系統模塊
var fs = require('fs');
建立一個可寫流
fs.createWriteStream(path[, options]);
  • 能夠建立一個可寫流
  • path 文件路徑
  • options 配置參數
打開文件
var ws = fs.createWriteStream('hello3.txt');
監聽流 可選
ws.once("open",function () {
    console.log("流打開了");
});
ws.once("close",function () {
    console.log("流關閉了");
});
  • 能夠經過監聽流的open和close事件來監聽流的打開和關閉
  • on(事件字符串,回調函數)ui

    • 能夠爲對象綁定一個事件
  • once(事件字符串,回調函數)編碼

    • 能夠爲對象綁定一個一次性的事件,該事件將會在出發一次之後自動失效
經過ws向文件中輸出內容
ws.write("經過可寫流寫入文件的內容1");
ws.write("經過可寫流寫入文件的內容2");
ws.write("經過可寫流寫入文件的內容3");
ws.write("經過可寫流寫入文件的內容4");
ws.write("經過可寫流寫入文件的內容5");
關閉流
ws.end();

文件讀取

簡單文件讀取

fs.readFile(path[, options], callback);
 fs.readFileSync(path[, options]);
  • path 要讀取文件的路徑

    • options 讀取的選項
    • callback 回調函數 經過回調函數將讀取到的內容返回

      • err 錯誤對象
      • data 讀取到的數據 會返回一個buffer

例子

var fs = require('fs');

fs.readFile('0.jpg',function (err,data) {
    if (!err) {
       // console.log(data);
        //將data寫入文件中
        fs.writeFile('hello.jpg',data,function (err) {
            if(!err){
                console.log("文件寫入成功");
            }
        })
    }
});

流式文件讀取

流式文件讀取也適用於一些比較大的文件,能夠分屢次將文件讀取到內存中

綁定方法

例子

var fs = require('fs');

// 建立一個可讀流
var rs = fs.createReadStream('0.jpg');

//建立一個可寫流
var ws = fs.createWriteStream('test.jpg')

// 監聽流的開啓和關閉

rs.once('open',function () {
    console.log("可讀流打開了");
});
rs.once('close',function () {
    console.log("可讀流關閉了");
    //數據讀取完畢,關閉可寫流
    ws.end();
});

ws.once('open',function () {
    console.log("可寫流打開了");
});
ws.once('close',function () {
    console.log("可寫流關閉了");
});

// 若是要讀取可讀流中的數據,必需要爲可讀流綁定一個data事件,data事件綁定完畢,他會自動開始讀取數據
rs.on("data",function (data) {
    // console.log(data.length);
    //將讀取到的數據寫入到可寫流中
    ws.write(data);
});

pipe方法

例子 官方文檔

var fs = require('fs');

// 建立一個可讀流
var rs = fs.createReadStream('0.jpg');

//建立一個可寫流
var ws = fs.createWriteStream('test.jpg')

// 監聽流的開啓和關閉
rs.once('open',function () {
    console.log("可讀流打開了");
});
rs.once('close',function () {
    console.log("可讀流關閉了");
});

ws.once('open',function () {
    console.log("可寫流打開了");
});
ws.once('close',function () {
    console.log("可寫流關閉了");
});

//pipe 能夠將可讀流中的內容,直接輸出到可寫流裏面
rs.pipe(ws);

經常使用方法

檢查一個文件是否存在

fs.existsSync(path);
例子
var isExists = fs.existsSync('test.jpg');
console.log(isExists);

獲取文件狀態

fs.stat(path[, options], callback)  
fs.statSync(path[, options])
  • 它會返回一個對象,這個對象中保存了當前對象狀態的相關信息
例子 官網
fs.stat('test.jpg',function (err,stats) {
    /**
     * size 文件的大小
     * isFile() 是否 是一個文件
     * isDirectory() 是否 是一個文件夾(目錄)
     */
    if(!err){
        console.log(stats.isDirectory() );
    }
});

刪除文件

fs.unlink(path, callback)
fs.unlinkSync(path)
例子
fs.unlinkSync("test.jpg");

讀取一個目錄的目錄結構

fs.readdir(path[, options], callback)
 fs.readdirSync(path[, options])
  • files 是一個字符串數組,每個元素就是一個文件夾或文件的名字
例子
fs.readdir('.',function (err,files) {
   if(!err){
       console.log(files);
   }
});

截斷文件

fs.truncate(path[, len], callback)
 fs.truncateSync(path[, len])
  • 將文件修改成指定的大小
例子
fs.truncateSync('test.txt',10);

建立一個文件夾(目錄)

fs.mkdir(path[, mode], callback)
fs.mkdirSync(path[, mode])
例子
fs.mkdirSync("test");

刪除一個目錄

fs.rmdir(path, callback)
 fs.rmdirSync(path)
例子
fs.rmdirSync("test");

重命名文件夾

fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
  • 參數

    • oldPath 舊的路徑
    • newPath 新的路徑
    • callback 回調函數
例子
fs.rename('test1.jpg','test2.jpg',function (err) {
    if (!err) {
        console.log('修改爲功');
    }
});

監視文件的修改

fs.watchFile(filename[, options], listener)
  • 參數

    • filename 要監視的文件名字
    • options 配置選項

      • 官網默認5s 可調 interval
    • listener 回調函數 當文件發生變化時 回調函數會執行

      • 在回調函數中有兩個參數

        • curr 當前文件的狀態
        • prev 修改前文件的狀態

          • 這兩個對象都是 stats對象
例子 官網
fs.watchFile('test.txt',{interval:1000},function (curr, prev) {
    console.log("修改前文件大小==>"+prev.size);
    console.log("修改後文件大小==>"+curr.size);
});
相關文章
相關標籤/搜索