nodejs模塊——fs模塊小記

1、同步和異步
使用require('fs')載入fs模塊,模塊中全部方法都有同步和異步兩種形式。
異步方法中回調函數的第一個參數老是留給異常參數(exception),若是方法成功完成,該參數爲null或undefined。
異步寫法demo:有一個回調函數。node

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

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

同步寫法demo:數組

var fs = require('fs');

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

同步方法執行完並返回結果後,才能執行後續的代碼。而異步方法採用回調函數接收返回結果,能夠當即執行後續代碼。
2、readFile讀取文件
fs.readFile(filename,[option],callback) 方法讀取文件。緩存

參數說明:異步

  • filename String 文件名
  • option Object函數

    - encoding String |null default=null
    
    - flag String default='r'
  • callback Function

demo
有一個文本文件text.txt內容以下測試

line one
line two

和text.txt相同目錄中有一個readfile.js,內容以下
readFile的回調函數接收兩個參數,err是讀取文件出錯時觸發的錯誤對象,data是從文件讀取的數據。ui

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

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

$ node readfile.js運行結果編碼

// 使用toString()
fs.readFile('./test.txt', function(err, data) {
    // 讀取文件失敗/錯誤
    if (err) {
        throw err;
    }
    // 讀取文件成功
    console.log(data.toString());
});

設置utf-8編碼寫法:spa

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

readFile同步的寫法就是沒有回調函數:fs.readFileSync(filename,[options])。
3、WriteFile寫入文件
使用fs.writeFile(filename,data,[options],callback)寫入內容到文件。code

參數說明:

  • 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模塊

// 寫入文件內容(若是文件不存在會建立一個文件)
// 寫入時會先清空文件
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);
    });
});

由於默認flag='w'是寫,會清空文件,想要追加,能夠傳遞一個flag參數,以下。

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

// 寫入文件內容(若是文件不存在會建立一個文件)
// 傳遞了追加參數 { 'flag': 'a' }
fs.writeFile('./test2.txt', 'test test', { 'flag': 'a' }, 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);
    });
});

flag傳值,r表明讀取文件,w表明寫文件,a表明追加。

4、使用fs.read和fs.write讀寫文件
fs.read和fs.write功能相似fs.readFile和fs.writeFile(),但提供更底層的操做,實際應用中多用fs.readFile和fs.writeFile。

使用fs.read和fs.write讀寫文件須要使用fs.open打開文件和fs.close關閉文件。
一、fs.read()
先介紹fs.open。
fs.open(path,flags,[mode],callback)方法用於打開文件,以便fs.read()讀取。
參數說明:

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

flags值及說明以下:

r :讀取文件,文件不存在時報錯;
r+ :讀取並寫入文件,文件不存在時報錯;
rs :以同步方式讀取文件,文件不存在時報錯;
rs+ :以同步方式讀取並寫入文件,文件不存在時報錯;
w :寫入文件,文件不存在則建立,存在則清空;
wx :和w同樣,可是文件存在時會報錯;
w+ :讀取並寫入文件,文件不存在則建立,存在則清空;
wx+ :和w+同樣,可是文件存在時會報錯;
a :以追加方式寫入文件,文件不存在則建立;
ax :和a同樣,可是文件存在時會報錯;
a+ :讀取並追加寫入文件,文件不存在則建立;
ax+ :和a+同樣,可是文件存在時會報錯。

fs.close(fd,[callback])
用於關閉文件,fd是所打開文件的文件描述符。
fs.read(fd,buffer,offset,length,position,callback)接收6個參數。
參數說明:

  • fd 文件描述符,必須接收fs.open()方法中的回調函數返回的第二個參數。
  • buffer 是存放讀取到的數據的Buffer對象。
  • offset 指定 向buffer中存放數據的起始位置。
  • length 指定 讀取文件中數據的字節數。
  • position 指定 在文件中讀取文件內容的起始位置。
  • callback 回調函數,參數以下

    - err 用於拋出異常
    
    - bytesRead 從文件中讀取內容的實際字節數。
    
    - buffer 被讀取的緩存區對象。

demo: read.js內容以下

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中存入的數據
        console.log(bytesRead, buffer.slice(0, bytesRead).toString());

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

運行結果

圖片描述

二、fs.write()
fs.read(fd,buffer,offset,length[,position],callback(err,bytesWritten,buffer))接收6個參數。
參數說明:

  • fd 文件描述符,必須接收fs.open()方法中的回調函數返回的第二個參數。
  • buffer 是存放 將被寫入的數據,buffer尺寸的大小設置最好是8的倍數,效率較高。
  • offset buffer寫入的偏移量。
  • length (integer)指定 寫入文件中數據的字節數。
  • position (integer) 指定 在寫入文件內容的起始位置。
  • callback 回調函數,參數以下

    - err 用於拋出異常
    
    - bytesWritten從文件中讀取內容的實際字節數。
    
    - buffer 被讀取的緩存區對象。
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中存入的數據
        console.log(bytesWritten, buffer.slice(0, bytesWritten).toString());

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

運行結果以下:
圖片描述

5、目錄操做

一、建立目錄
使用fs.mkdir(path,[mode],callback)建立目錄,path是須要建立的目錄,[mode]是目錄的權限(默認是0777),callback是回調函數。
demo:mkdir.js內容以下

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

// 建立 newdir 目錄
fs.mkdir('./newdir', function(err) {
    if (err) {
        throw err;
    }
    console.log('make dir success.');
});

刪除目錄能夠用fs.rmdir(path,callback);可是隻能刪除空目錄。

二、讀取目錄

使用fs.readdir(path,callback)讀取文件目錄。
demo:readdir.js內容以下

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

fs.readdir('./newdir', function(err, files) {
    if (err) {
        throw err;
    }
    // files是一個數組
    // 每一個元素是此目錄下的文件或文件夾的名稱
    console.log(files);
});

結果輸出該目錄有哪些目錄和文件。
圖片描述

相關文章
相關標籤/搜索