Node.js 初識 fs 模塊

fs 模塊是文件操做的封裝,它提供了文件的讀取、寫入、改名、刪除、遍歷目錄、連接等 Unix 文件系統操做。與其餘模塊不一樣的是,fs 模塊中全部的操做都提供了 同步異步 兩個版本,好比讀取文件內容的函數有 異步的 fs.readFile() 和 同步的 fs.readFileSync().
html


Node.js 導入文件系統模塊的語法以下:
node

var fs = require('fs');


一、異步和同步讀取文件編程


fs.readFile(file[, options], callback(err,data))api

異步讀取文件的所有內容緩存


參數:app

file <String> | <Buffer> | <Integer>,要讀取的文件名,必選參數       異步

options <Object> | <String>, 可選參數,可指定 flag(文件操做選項,如 r+ 讀寫;w+讀寫,文 件不存在則建立)及 encoding 屬性
ide

        encoding:  <String> | <Null>,表示文件的字符編碼
異步編程

        flag: <String>  ,默認 'r' 
函數

callback <Function>,回調函數提供了兩個參數 err 和 data,err 表示有沒有錯誤發生,data 是文件內容


若是指定了第二個參數 encoding,回調函數中的 data 是一個解析後的字符串,不然 data 將會是以 Buffer 形式表示的二進制數據


新建一個 content.txt,裏面添加一行簡單的文本

你好,世界!


異步讀取文件,示例代碼以下:

var fs = require('fs');

fs.readFile('./content.txt', {flag: 'r+', encoding: 'utf8'}, function(err, data){
    if(err){
        console.error(err);
        return;
    }
    console.log('異步讀取:'+ data);
});


運行結果以下:

wKiom1hy-XPCiNIwAABhIHzbFBY311.png


當讀取文件出現錯誤時,err 將會是 Error 對象。例如:讀取一個不存在的 content1.txt 文件,運行代碼時,會報以下錯誤。

wKioL1hy-oThdAJEAAB_3L6Prfs473.png


Node.js 的異步編程接口習慣是以函數的最後一個參數爲回調函數,一般一個函數只有一個回調函數。回調函數的實際參數中第一個是 err,其他參數是其餘返回內容。若是沒有發生錯誤,err 的值會是 null 或 undefined。若是有錯誤發生,err 一般是 Error 對象的實例



fs.readFileSync(file[, options])

 fs.readFile 的同步版本,返回文件的內容


它接受的參數和 fs.readFile 相同,而讀取到的文件內容會以函數返回值的形式返回。若是有錯誤發生,fs 將會拋出異常,須要使用 try 和 catch 捕捉並處理異常。


與同步 I/O 函數不一樣,Node.js 中異步函數大多沒有返回值


同步讀取文件示例:

var fs = require('fs');

//同步讀取
var data = fs.readFileSync('./content.txt','utf8');
console.log('同步讀取:'+ data);
console.log('程序執行完畢!');


運行結果:

wKioL1hy_wyRwIOtAABi7vyJVsw730.png



二、獲取文件信息


fs.stat(path, callback)

經過異步模式獲取文件信息


參數:

path: <String> | <Buffer>,文件的路徑

callback: <Function>,回調函數,帶有兩個參數 err 和 status,stats 是  fs.Stats  對象


fs.stat() 執行後,會將 stats 類的實例返回給其回掉函數。能夠經過 stats 類中提供的方法判斷文件的相關屬性,例如:判斷是否爲文件夾

var fs = require('fs');

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


stats 類中的方法有:

wKiom1hzLlDgjmKvAAB7mAcW5P0907.png

新建一個 js 文件,代碼以下:

var fs = require('fs');

console.log('準備打開文件!');

fs.stat('./content.txt', function(err, stats){
    if(err){
        console.err(error);
    }
    console.log(stats);
    console.log('讀取信息成功!');

    //檢測文件類型
    console.log('是否爲文件(isFile)?'+ stats.isFile());
    console.log('是否爲目錄(isDirectory)?'+ stats.isDirectory());
})


運行結果:

wKioL1hzMU2wqjy1AAAur74m40g932.png



三、寫入文件


fs.writeFile(file, data[, options], callback)

異步的方式把數據寫入文件,若是文件存在,該方法寫入的內容會覆蓋舊的文件內容


參數:

file:  <String> | <Buffer> | <Integer>,要讀取的文件名,必選參數       

data:  <String> | <Buffer> ,要寫入的數據,能夠是  <String>  也能夠是  <Buffer> (對象流)

options:  <Object> | <String>, 

        encoding:  <String> | <Null>,表示文件的字符編碼,默認'utf8'

        mode: <Integer> ,權限,默認 0o666 

        flag: <String>  ,默認 'w' 

callback <Function>,回調函數只包含錯誤信息參數(err),在寫入失敗時返回


若是 data 是一個 <Buffer> ,那麼 option 中的 encoding 會被忽略掉,將默認爲 'utf8'



示例代碼:

var fs = require('fs');

console.log('準備寫入文件!');

fs.writeFile('./content.txt', '我是異步寫入的文件內容', function(err){
    if(err){
        console.err(error);
    }
    console.log('數據寫入成功!');
    console.log('--------------我是分割線---------------');
    console.log('讀取寫入的數據!');
    fs.readFile('./content.txt', function(err, data){
        if(err){
            console.err(error);
        }
        console.log('異步讀取文件數據:' +data);

    })
})


運行結果:

wKiom1hzN3_hzZbAAAAgBszE7XI670.png


同時,原來的 content.txt 中的內容變爲:

wKioL1hzN7jgY-NzAAAQGOY4zsk058.png



fs.appendFile(file, data[, options], callback)

以追加的方式寫入文件


示例代碼:

var fs = require('fs');

fs.appendFile('./content.txt', '我是被追加寫入的數據', function(err){
    if(err){
        console.log(error);
    }
});

fs.readFile('./content.txt', function(err, data){
    if(err){
        console.log(error);
    }
    console.log('異步讀取文件數據:' +data);
})


運行結果:(在原數據後追加數據,不會覆蓋原內容)

wKioL1hzO2fgZ1hNAAAR3cWfZ18739.png



四、讀取文件


fs.read(fd, buffer, offset, length, position, callback(err, bytesRead, buffer))

從指定的文件描述符 fd 中讀取數據並寫入 buffer 指向的緩衝區對象


參數:

fd :  <Integer>,使用 fs.open 打開成功後返回的文件描述符

buffer : <String> | <Buffer> ,一個 buffer 對象,V8引擎分配的一段內存

offset : <Integer> ,整數,向緩存區中寫入時的初識位置,以字節爲單位

length : <Integer> ,整數,讀取文件的長度

position : <Integer> ,整數,讀取文件的初識位置;文件大小以字節爲單位

若是 position  爲 null,將從當前文件指針的位置讀取

callback : <Function> ,讀取執行完成後的回調函數,有三個參數 err, bytesRead, buffer

     - err:錯誤信息

     - bytesRead:表示讀取的字節數

     - buffer:緩衝區對象


示例代碼以下:

var fs = require('fs');

var buf = new Buffer(1024);

console.log('準備打開已存在的文件!');
fs.open('./content.txt', 'r+', function(err, fd){
    if(err){
        console.error(err);
    }
    console.log('文件打開成功!');
    console.log('準備讀取文件:');
    fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
        if(err){
            console.error(err);
        }
        //每個漢字utf8編碼是3個字節
        console.log(bytes+ '字節被讀取');

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


運行結果:

wKioL1hzRpHT108YAAAgDyrf6QI824.png



五、打開文件


fs.open(path, flags[, mode], callback(err, fd))

異步的方式打開文件


path: <String> | <Buffer>,文件的路徑

flags: <String> | <Number>,文件打開的行爲,具體參考下表

mode: <Integer>,設置文件模式(權限),文件建立默認權限爲 0666(可讀,可寫)

callback: <Function>,回調函數,帶有兩個參數 err 和 fd


flags 參數能夠是如下值:

wKiom1hzAUrwnIfvAADGPloHgW0874.png


示例代碼:以讀寫模式打開文件 content.txt

var fs = require('fs');

//異步打開文件
console.log('準備打開文件!');
fs.open('./content.txt','r+',function(err, fd){
    if(err){
        return console.error(err);
    }
    console.log('文件打開成功!');
});


運行結果:

wKiom1hzBsDSH_zNAABuy2Wb2Tk231.png


fs.openSync(path, flags[, mode])

 fs.open() 的同步版本,返回一個  <Integer> 表明讀取的文件



六、建立目錄

fs.mkdir(path[, mode], callback(err))

建立目錄


參數:

path <String> | <Buffer> ,被建立目錄的完整路徑及目錄名

[mode] : <Integer> ,整數,目錄權限,默認 0777

callback : <Function> ,建立完目錄回調函數,err 錯誤對象



示例代碼:

var fs = require('fs');

console.log('建立目錄 /src/test');

fs.mkdir('src/test', function(err){
    if(err){
        console.error(err);
    }
    console.log('目錄建立成功!');
});


建立前截圖:

wKiom1hzS0zg2es_AACknsbeZh0993.png


建立後截圖:

wKioL1hzS5SjAZv2AACcI07G6M0493.png

相關文章
相關標籤/搜索