fs模塊用於對系統文件及目錄進行讀寫操作。
一、同步和異步
使用require('fs')載入fs模塊,模塊中所有方法都有同步和異步兩種形式。
異步方法中回調函數的第一個參數總是留給異常參數(exception),如果方法成功完成,該參數為null或undefined。
異步寫法demo:有一個回調函數。
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');
同步方法執行完並返回結果后,才能執行后續的代碼。而異步方法采用回調函數接收返回結果,可以立即執行后續代碼。
二、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是從文件讀取的數據。
var fs = require('fs'); // 引入fs模塊 fs.readFile('./test.txt', function(err, data) { // 讀取文件失敗/錯誤 if (err) { throw err; } // 讀取文件成功 console.log(data); });
$ node readfile.js運行結果
<Buffer 6c 69 6e 65 20 6f 6e 65 0a 6c 69 6e 65 20 74 77 6f 0a>
這是原始二進制數據在緩沖區中的內容。
要顯示文件內容可以使用toString()或者設置輸出編碼。
toString()寫法:
// 使用toString() fs.readFile('./test.txt', function(err, data) { // 讀取文件失敗/錯誤 if (err) { throw err; } // 讀取文件成功 console.log(data.toString()); });
設置utf-8編碼寫法:
// 設置編碼格式 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])。
三、WriteFile寫入文件
使用fs.writeFile(filename,data,[options],callback)寫入內容到文件。
參數說明:
- 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代表追加。
四、使用fs.read和fs.write讀寫文件
fs.read和fs.write功能類似fs.readFile和fs.writeFile(),但提供更底層的操作,實際應用中多用fs.readFile和fs.writeFile。
使用fs.read和fs.write讀寫文件需要使用fs.open打開文件和fs.close關閉文件。
1、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); }); });
運行結果
2、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); }); });
運行結果如下:
五、目錄操作
1、創建目錄
使用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);但是只能刪除空目錄。
2、讀取目錄
使用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); });
結果輸出該目錄有哪些目錄和文件。
本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載注明出處:http://www.cnblogs.com/starof/p/5038300.html有問題歡迎與我討論,共同進步。