本文轉載自 https://www.cnblogs.com/starof/p/5038300.html
nodejs子產品——fs子產品
fs子產品用于對系統檔案及目錄進行讀寫操作。
一、同步和異步
使用require('fs')載入fs子產品,子產品中所有方法都有同步和異步兩種形式。
異步方法中回調函數的第一個參數總是留給異常參數(exception),如果方法成功完成,該參數為null或undefined。
異步寫法demo:有一個回調函數。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
var fs = require('fs'); // 載入fs子產品
fs.unlink('/tmp/shiyanlou', function(err) { //unlink為删除檔案方法
if (err) {
throw err;
}
console.log('成功删除了 /tmp/shiyanlou');
});
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
同步寫法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是從檔案讀取的資料。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
var fs = require('fs'); // 引入fs子產品
fs.readFile('./test.txt', function(err, data) {
// 讀取檔案失敗/錯誤
if (err) {
throw err;
}
// 讀取檔案成功
console.log(data);
});
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
$ node readfile.js運作結果
<Buffer 6c 69 6e 65 20 6f 6e 65 0a 6c 69 6e 65 20 74 77 6f 0a>
這是原始二進制資料在緩沖區中的内容。
要顯示檔案内容可以使用toString()或者設定輸出編碼。
toString()寫法:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
// 使用toString()
fs.readFile('./test.txt', function(err, data) {
// 讀取檔案失敗/錯誤
if (err) {
throw err;
}
// 讀取檔案成功
console.log(data.toString());
});
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
設定utf-8編碼寫法:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
// 設定編碼格式
fs.readFile('./test.txt', 'utf-8', function(err, data) {
// 讀取檔案失敗/錯誤
if (err) {
throw err;
}
// 讀取檔案成功
console.log('utf-8: ', data.toString());
//直接用console.log(data);也可以
});
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
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
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
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);
});
});
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
因為預設flag='w'是寫,會清空檔案,想要追加,可以傳遞一個flag參數,如下。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
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);
});
});
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
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值及說明如下
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
r :讀取檔案,檔案不存在時報錯;
r+ :讀取并寫入檔案,檔案不存在時報錯;
rs :以同步方式讀取檔案,檔案不存在時報錯;
rs+ :以同步方式讀取并寫入檔案,檔案不存在時報錯;
w :寫入檔案,檔案不存在則建立,存在則清空;
wx :和w一樣,但是檔案存在時會報錯;
w+ :讀取并寫入檔案,檔案不存在則建立,存在則清空;
wx+ :和w+一樣,但是檔案存在時會報錯;
a :以追加方式寫入檔案,檔案不存在則建立;
ax :和a一樣,但是檔案存在時會報錯;
a+ :讀取并追加寫入檔案,檔案不存在則建立;
ax+ :和a+一樣,但是檔案存在時會報錯。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
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内容如下
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
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);
});
});
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
運作結果
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 被讀取的緩存區對象。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
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);
});
});
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
運作結果如下:
五、目錄操作
1、建立目錄
使用fs.mkdir(path,[mode],callback)建立目錄,path是需要建立的目錄,[mode]是目錄的權限(預設是0777),callback是回調函數。
demo:mkdir.js内容如下
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
var fs = require('fs'); // 引入fs子產品
// 建立 newdir 目錄
fs.mkdir('./newdir', function(err) {
if (err) {
throw err;
}
console.log('make dir success.');
});
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
删除目錄可以用fs.rmdir(path,callback);但是隻能删除空目錄。
2、讀取目錄
使用fs.readdir(path,callback)讀取檔案目錄。
demo:readdir.js内容如下
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
var fs = require('fs'); // 引入fs子產品
fs.readdir('./newdir', function(err, files) {
if (err) {
throw err;
}
// files是一個數組
// 每個元素是此目錄下的檔案或檔案夾的名稱
console.log(files);
});
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
結果輸出該目錄有哪些目錄和檔案。