NodeJs基礎學習--fs模塊(7)

在nodeJs中,所有的文件操作都是通過fs核心模塊來實現(xiàn)的,包括文件目錄的創(chuàng)建、刪除、查詢以及文件的讀取和寫入,在fs模塊中所有的方法都分為同步和異步倆種方法實現(xiàn)。
sync后綴則為同步方法,無后綴則為異步方法。

文件權限

linux && unix中
在系統(tǒng)中文件權限會根據(jù)文件所有者(自己)、組(家庭組)、其他用戶(陌生人)進行分配,
文件操作權限又分為讀寫執(zhí)行 (八進制 )4、2、1、0。0代表不具備權限

nodeJS標識位 flag

r 讀取文件,如果文件不存在則拋出異常。
r+ 讀取并寫入文件,如果文件不存在則拋出異常。
rs 讀取并寫入文件,指示操作系統(tǒng)繞開本地文件系統(tǒng)緩存。
w 寫入文件,文件不存在會被創(chuàng)建,存在則清空后寫入。
wx 寫入文件,排它方式打開。
w+ 讀取并寫入文件,文件不存在則創(chuàng)建文件,存在則清空后寫入。
wx+ 和 w+ 類似,排他方式打開。
a 追加寫入,文件不存在則創(chuàng)建文件。
ax 與 a 類似,排他方式打開。
a+ 讀取并追加寫入,不存在則創(chuàng)建。
ax+ 與 a+ 類似,排他方式打開

文件描述符 fd

操作系統(tǒng)會為每個打開的文件分配一個名為文件描述符的數(shù)值標識,文件操作使用這些文件描述符來識別與追蹤每個特定的文件,Window 系統(tǒng)使用了一個不同但概念類似的機制來追蹤資源,為方便用戶,NodeJS 抽象了不同操作系統(tǒng)間的差異,為所有打開的文件分配了數(shù)值的文件描述符。

在 NodeJS 中,每操作一個文件,文件描述符是遞增的,文件描述符一般從 3 開始,因為前面有 0 、 1 、 2 三個比較特殊的描述符,分別代表 process.stdin (標準輸入)、 process.stdout (標準輸出)和 process.stderr (錯誤輸出)。

fs模塊

一、同步和異步

使用require('fs')載入fs模塊,模塊中所有方法都有同步和異步兩種形式。
異步方法中回調函數(shù)的第一個參數(shù)總是留給異常參數(shù)(exception),如果方法成功完成,該參數(shù)為null或undefined。
同步方法執(zhí)行完并返回結果后,才能執(zhí)行后續(xù)的代碼。而異步方法采用回調函數(shù)接收返回結果,可以立即執(zhí)行后續(xù)代碼。
異步寫法:有一個回調函數(shù)。

var fs = require('fs'); // 載入fs模塊

fs.unlink('/tmp/shiyanlou', function(err) {
    if (err) {
        throw err;
    }
    console.log('成功刪除了 /tmp/shiyanlou');
});

同步寫法:

var fs = require('fs');

fs.unlinkSync('/tmp/shiyanlou'); // Sync 表示是同步方法
console.log('成功刪除了 /tmp/shiyanlou');

二、readFile讀取文件

//fs.readFile(filename,[option],callback)
    //filename String 文件名
    //option Object
        //encoding String |null default=null
        //flag String default='r'
    //callback Function

var fs = require('fs'); // 引入fs模塊
fs.readFile('./test.txt', function(err, data) {
    // 讀取文件失敗/錯誤
    if (err) {
        throw err;
    }
    // 讀取文件成功
    console.log(data);
});

node 讀取文件.js 運行程序
可以發(fā)現(xiàn) 文件內容為2進制數(shù)據(jù) <Buffer xx xx xx xx.....>

要顯示文件內容可以使用toString() 或者設置輸出編碼。

//toString()寫法:
fs.readFile('./test.txt', function(err, data) {
    // 讀取文件失敗/錯誤
    if (err) {
        throw err;
    }
    // 讀取文件成功
    console.log(data.toString());
});
//設置編碼格式
fs.readFile('./test.txt', 'utf-8', function(err, data) {
    // 讀取文件失敗/錯誤
    if (err) {
        throw err;
    }
    // 讀取文件成功
    console.log('utf-8: ', data.toString());
  //直接用console.log(data);也可以
});

同步寫法沒有回調函數(shù)
fs.readFileSync(filename,[options])。

WriteFile寫入文件

//使用fs.writeFile(filename,data,[options],callback)寫入內容到文件。

//參數(shù)說明:
//filename String 文件名
//data String|buffer
//option Object
    //encoding String |nulldefault='utf-8'
    //mode Number default=438(aka 0666 in Octal)
    //flag Stringdefault='w'
//callback Function

//demo

var fs = require('fs'); // 引入fs模塊

// 寫入文件內容(如果文件不存在會創(chuàng)建一個文件)
// 寫入時會先清空文件
fs.writeFile('./test2.txt', 'test test', function(err) {
    if (err) {
        throw err;
    }

    console.log('Saved.');

    // 寫入成功后讀取測試
    fs.readFile('./test2.txt', 'utf-8', function(err, data) {
        if (err) {
            throw err;
        }
        console.log(data);
    });
});

參數(shù)option{}中 flag 默認值 w,即會清空文件 ,想要追加,可以傳遞flag 參數(shù),

文件讀寫操作進階

fs.read && fs.write 功能類似 fs.readFile && fs.writeFile,但提供更底層的操作;

使用fs.read 和fs.write 前 需要使用 fs.open 打開文件 和 fs.close 關閉文件。

1.fs.open

fs.open(path,flags,[mode],callback)方法用于打開文件,以便fs.read()讀取。

參數(shù):

  • path 文件路徑
  • flags打開文件的方式
  • [mode] 是文件的權限(可行參數(shù),默認值是0666)
  • callback 回調函數(shù)

flags以及model(權限) 在上方有介紹;

2.fs.close

fs.close(fd,[callback]) 方法用于關閉文件
參數(shù) :
fd 為文件的描述符,標識,fs.open()方法中的回調函數(shù)中返回的第二個參數(shù)即為fd;
callback 關閉成功回調函數(shù);

3.fs.read

fs.read(fd,buffer,offset,length,position,callback) 接收6個參數(shù)。

  • fd 文件描述符,必須接收fs.open()方法中的回調函數(shù)返回的第二個參數(shù)。
  • buffer 是存放讀取到的數(shù)據(jù)的Buffer對象。
  • offset 指定 向buffer中存放數(shù)據(jù)的起始位置。
  • length 指定 讀取文件中數(shù)據(jù)的字節(jié)數(shù)。
  • position 指定 在文件中讀取文件內容的起始位置。
  • callback 回調函數(shù),參數(shù)如下
    • err 用于拋出異常
    • bytesRead 從文件中讀取內容的實際字節(jié)數(shù)。
    • buffer 被讀取的緩存區(qū)對象。

123連起來的demo如下:

var fs = require('fs'); // 引入fs模塊

// 打開文件
fs.open('./testread.txt', 'r', function(err, fd) {
    if (err) {
        throw err;
    }
    console.log('open file success.');
    var buffer = new Buffer(255);
    // 讀取文件
    fs.read(fd, buffer, 0, 10, 0, function(err, bytesRead, buffer) {
        if (err) {
            throw err;
        }
        // 打印出buffer中存入的數(shù)據(jù)
        console.log(bytesRead, buffer.slice(0, bytesRead).toString());

        // 關閉文件
        fs.close(fd);
    });
});

fs.write()

fs.write(fd,buffer,offset,length[,position],callback(err,bytesWritten,buffer))接收6個參數(shù)。

  • fd 文件描述符。
  • buffer 緩沖區(qū),數(shù)據(jù)將被寫入。buffer尺寸的大小設置最好是8的倍數(shù),效率較高。
  • offset buffer寫入的偏移量
  • length (integer) 指定文件讀取字節(jié)數(shù)長度
  • position (integer) 指定文件讀取的起始位置,如果該項為null,將從當前文件指針的位置開始讀取數(shù)據(jù)。
  • callback 回調傳遞了三個參數(shù),err, bytesRead, buffer
    • err 異常
    • bytesRead:讀取的字節(jié)數(shù)
    • buffer:緩沖區(qū)對象
var fs = require('fs'); // 引入fs模塊

// 打開文件
fs.open('./testwrite.txt', `w`, function(err, fd) {
    if (err) {
        throw err;
    }
    console.log('open file success.');
    var buffer = new Buffer('shiyanlou');
    // 讀取文件
    fs.write(fd, buffer, 0, 6, 0, function(err, bytesWritten, buffer) {
        if (err) {
            throw err;
        }

        console.log('write success.');
        // 打印出buffer中存入的數(shù)據(jù)
        console.log(bytesWritten, buffer.slice(0, bytesWritten).toString());

        // 關閉文件
        fs.close(fd);
    });
});

目錄操作

1、創(chuàng)建目錄

fs.mkdir(path,[mode],callback)創(chuàng)建目錄,path是需要創(chuàng)建的目錄,[mode]是目錄的權限(默認是0777),callback是回調函數(shù)

var fs = require('fs'); // 引入fs模塊
// 創(chuàng)建 newdir 目錄
fs.mkdir('./newdir', function(err) {
    if (err) {
        throw err;
    }
    console.log('make dir success.');
});

2、讀取目錄

使用fs.readdir(path,callback)讀取文件目錄。

var fs = require('fs'); // 引入fs模塊

fs.readdir('./newdir', function(err, files) {
    if (err) {
        throw err;
    }
    // files是一個數(shù)組
    // 每個元素是此目錄下的文件或文件夾的名稱
    console.log(files);
});
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容