node總結之檔案操作系列(一)
Node.js 提供一組類似 UNIX(POSIX)標準的檔案操作API,我們來看下Node 匯入檔案系統模組(fs)語法,如下:
var fs = require("fs")
Node.js 檔案系統(fs 模組)模組中的方法均有非同步和同步版本,例如讀取檔案內容的函式有非同步的 fs.readFile() 和同步的 fs.readFileSync()。其中,非同步的方法函式最後一個引數為回撥函式,回撥函式的第一個引數包含了錯誤資訊(error)。個人建議大家使用非同步方法,比起同步,非同步方法效能更高,速度更快,而且沒有阻塞,來看測試檔案input.txt 檔案,內容如下:
luyaran is my lover
先來看一個例項:
var fs = require("fs"); // 非同步讀取 fs.readFile('input.txt', function (err, data) { if (err) { return console.error(err); } console.log("非同步讀取: " + data.toString()); }); // 同步讀取 var data = fs.readFileSync('input.txt'); console.log("同步讀取: " + data.toString()); console.log("程式執行完畢。");
我們來看下在非同步模式下開啟檔案的語法格式,如下:
fs.open(path, flags[, mode], callback)
引數描述如下:
-
path - 檔案的路徑。
-
flags - 檔案開啟的行為。具體值詳見下文。
-
mode - 設定檔案模式(許可權),檔案建立預設許可權為 0666(可讀,可寫)。
-
callback - 回撥函式,帶有兩個引數如:callback(err, fd)。
來看下flags 引數具體可以使用那些值:
Flag | 描述 |
---|---|
r | 以讀取模式開啟檔案。如果檔案不存在丟擲異常。 |
r+ | 以讀寫模式開啟檔案。如果檔案不存在丟擲異常。 |
rs | 以同步的方式讀取檔案。 |
rs+ | 以同步的方式讀取和寫入檔案。 |
w | 以寫入模式開啟檔案,如果檔案不存在則建立。 |
wx | 類似 'w',但是如果檔案路徑存在,則檔案寫入失敗。 |
w+ | 以讀寫模式開啟檔案,如果檔案不存在則建立。 |
wx+ | 類似 'w+', 但是如果檔案路徑存在,則檔案讀寫失敗。 |
a | 以追加模式開啟檔案,如果檔案不存在則建立。 |
ax | 類似 'a', 但是如果檔案路徑存在,則檔案追加失敗。 |
a+ | 以讀取追加模式開啟檔案,如果檔案不存在則建立。 |
ax+ | 類似 'a+', 但是如果檔案路徑存在,則檔案讀取追加失敗。 |
看下例項:
var fs = require("fs");
// 非同步開啟檔案
console.log("準備開啟檔案!");
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
console.log("檔案開啟成功!");
});
再來看下通過非同步模式獲取檔案資訊的語法格式:
fs.stat(path, callback)
引數描述如下:
-
path - 檔案路徑。
-
callback - 回撥函式,帶有兩個引數如:(err, stats), stats 是 fs.Stats 物件。
fs.stat(path)執行後,會將stats類的例項返回給其回撥函式,我們可以通過stats類中的提供方法判斷檔案的相關屬性。來看下判斷是否為檔案的例項:
var fs = require('fs');
fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) {
console.log(stats.isFile()); //true
})
再來看下stats類中的方法:
方法 | 描述 |
---|---|
stats.isFile() | 如果是檔案返回 true,否則返回 false。 |
stats.isDirectory() | 如果是目錄返回 true,否則返回 false。 |
stats.isBlockDevice() | 如果是塊裝置返回 true,否則返回 false。 |
stats.isCharacterDevice() | 如果是字元裝置返回 true,否則返回 false。 |
stats.isSymbolicLink() | 如果是軟連結返回 true,否則返回 false。 |
stats.isFIFO() | 如果是FIFO,返回true,否則返回 false。FIFO是UNIX中的一種特殊型別的命令管道。 |
stats.isSocket() | 如果是 Socket 返回 true,否則返回 false。 |
例項如下:
var fs = require("fs");
console.log("準備開啟檔案!");
fs.stat('input.txt', function (err, stats) {
if (err) {
return console.error(err);
}
console.log(stats);
console.log("讀取檔案資訊成功!");
// 檢測檔案型別
console.log("是否為檔案(isFile) ? " + stats.isFile());
console.log("是否為目錄(isDirectory) ? " + stats.isDirectory());
});
再來看下非同步模式下寫入檔案的語法格式:
fs.writeFile(file, data[, options], callback)
可能有過經驗的知道,writeFile 直接開啟檔案預設是 w 模式,所以如果檔案存在,該方法寫入的內容會覆蓋舊的檔案內容,但是,fs.writeFile 並不一定是覆蓋原來檔案內容,而是取決於開啟檔案時帶的 flags。如果我們是通過 writeFile 直接開啟檔案,那麼預設是 w 模式,但是也可以通過 open 開啟檔案指定模式,然後通過 writeFile 來寫檔案,來看例項:
fs.open(fileName, "a+", function(err, fd){
if (err) {
return console.error(err);
}
fs.writeFile(fd, "bb", function(err){
if (err){
return console.error(err);
}
});
});
上述程式碼的writeFile 是追加模式寫檔案。
咱接著剛剛的來,看下引數描述:
-
file - 檔名或檔案描述符。
-
data - 要寫入檔案的資料,可以是 String(字串) 或 Buffer(緩衝) 物件。
-
options - 該引數是一個物件,包含 {encoding, mode, flag}。預設編碼為 utf8, 模式為 0666 , flag 為 'w'
-
callback - 回撥函式,回撥函式只包含錯誤資訊引數(err),在寫入失敗時返回。
來看完整例項:
var fs = require("fs");
console.log("準備寫入檔案");
fs.writeFile('input.txt', '我是通 過fs.writeFile 寫入檔案的內容', function(err) {
if (err) {
return console.error(err);
}
console.log("資料寫入成功!");
console.log("--------我是分割線-------------")
console.log("讀取寫入的資料!");
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("非同步讀取檔案資料: " + data.toString());
});
});
最後就是非同步模式下讀取檔案的語法格式:
fs.read(fd, buffer, offset, length, position, callback)
這個方法會使用檔案描述符來讀取檔案,來看引數描述:
-
fd - 通過 fs.open() 方法返回的檔案描述符。
-
buffer - 資料寫入的緩衝區。
-
offset - 緩衝區寫入的寫入偏移量。
-
length - 要從檔案中讀取的位元組數。
-
position - 檔案讀取的起始位置,如果 position 的值為 null,則會從當前檔案指標的位置讀取。
-
callback - 回撥函式,有三個引數err, bytesRead, buffer,err 為錯誤資訊, bytesRead 表示讀取的位元組數,buffer 為緩衝區物件。
例項如下:
var fs = require("fs");
var buf = new Buffer.alloc(1024);
console.log("準備開啟已存在的檔案!");
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
console.log("檔案開啟成功!");
console.log("準備讀取檔案:");
fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
if (err){
console.log(err);
}
console.log(bytes + " 位元組被讀取");
// 僅輸出讀取的位元組
if(bytes > 0){
console.log(buf.slice(0, bytes).toString());
}
});
});
好啦,本次記錄就到這裡了。
如果感覺不錯的話,請多多點贊支援哦。。。