該文章以收錄 《nodeJS探索之路》
本文所有練習已放入:https://github.com/webxiaoma/nodeJS-demos 的 file 資料夾中
前言
fs模組在nodeJS算是比較重要的模組了,本文主要講的是nodejs 中fs模組的基礎知識,目的是瞭解fs模組的大體作用。使用前先要引入fs模組,本文約定以const fs=require(`fs`)
引入。詳細的API請訪問官網fs模組
同步和非同步
fs模組中的方法一般的都有同步和非同步的方法,例如讀取檔案
非同步方法:
fs.readFile(`./test.txt`,(err,data)=>{
if(err) throw err;
console.log(data)
})
同步方法
let SyncFile = fs.readFileSync( `./test.txt`,`utf-8`);
cosnole.log(SyncFile);
一般同步方法是在非同步方法名後面加上了Sync
一詞。
檔案處理
1.讀取檔案內容
fs.readFile(path[, options], callback)
引數:
-
path
<string> | <Buffer> | <URL> | <integer>
檔名或檔案描述符。 -
options
<Object> | <string>
-
encoding
<string> | <null>
預設為 null。 -
flag
<string>
預設為 `r`。
-
callback
<Function>
-
err
<Error>
-
data
<string> | <Buffer>
fs.readFile(`./test.txt`,function(err,data){
if(err){
throw err;
}
console.log(data)
console.log(data.toString())
})
2.寫入檔案內容
fs.writeFile(file, data[, options], callback)
非同步地寫入資料到檔案,如果檔案已經存在,則替代檔案。
-
file
<string> | <Buffer> | <integer>
檔名或檔案描述符 -
data
<string> | <Buffer> | <Uint8Array>
-
options
<Object> | <string>
-
encoding
<string> | <null>
預設 = `utf8` -
mode
<integer>
預設 = 0o666 -
flag
<string>
預設 = `w`
-
callback
<Function>
fs.writeFile(`./write.txt`,`test`,err =>{
if(err) throw err;
console.log("寫入成功");
fs.readFile(`./write.txt`,`utf-8`,(err,data) =>{
if(err) throw err;
console.log(`讀取成功:`+ data);
})
})
3.刪除檔案內容
fs.unlink(path, callback)
-
path
<string> | <Buffer> | <URL>
-
callback
<Function>
-
err
<Error>
fs.unlink(`./delete.txt`,err=>{
assert.ifError(err);
console.log(`以刪除檔案:delete.txt`)
})
4.追加檔案內容
fs.appendFile(file, data[, options], callback)
如果追加內容的檔案不存在則,建立該檔案
-
file
<string> | <Buffer> | <number>
檔名或檔案描述符 -
data
<string> | <Buffer>
-
options
<Object> | <string>
-
encoding
<string> | <null>
預設為 `utf8` -
mode
<integer>
預設為 0o666 -
flag
<string>
預設為 `a`
-
callback
<Function>
-
err
<Error>
fs.appendFile(`./add.txt`,`追加的內容`,`utf8`,(err)=>{
assert.ifError(err);
console.log(fs.readFileSync(`./add.txt`,`utf8`))
})
5.擷取檔案內容
在說擷取檔案內容之前,我們還要說一種開啟檔案,讀取寫入檔案內容的方法
開啟檔案: fs.open
讀取檔案內容: fs.read
寫入檔案內容:fs.write
關閉檔案:fs.close
他們和readFile
、writeFile
的區別就是比較底層,fs.read
和fs.write
需要依託fs.open
, 開啟檔案得到檔案控制程式碼,然後基於檔案控制程式碼讀寫。實際上我們用的readFile
、writeFile
還是比較多。我們來看一個例子:
fs.open(`./open.txt`,`a+`,(err,fd)=>{
if(err) throw err;
console.log("檔案以開啟");
let readBuffer = new Buffer.alloc(30);
let writeBuffer = new Buffer.from(" add content")
fs.write(fd,writeBuffer,0,writeBuffer.length,0,(err,bytesWritten,buffer)=>{
if(err) throw err;
console.log(`寫入成功,寫入的長度:${bytesWritten}, 寫入的內容:${buffer}`);
//寫入成功,寫入的長度: 12, 寫入的內容:add content
fs.read(fd,readBuffer,0,30,0,(err, bytesRead, buffer)=>{
if(err) throw err;
console.log(bytesRead) // 17
console.log(buffer.toString());// last add content
// 關閉
fs.close(fd);
})
})
})
我們這裡說的擷取檔案內容的方法是基於fs.open
方法的
fs.ftruncate(fd[, len], callback)
-
fd
<integer>
-
len
<integer>
預設 = 0 -
callback
<Function>
-
err
<Error>
let fd = fs.openSync(`open.txt`,`r+`);
fs.ftruncate(fd,5,(err)=>{
assert.ifError(err);
console.log("擷取內容為:" +fs.readFileSync(`open.txt`,`utf-8`));
//擷取內容為:last
fs.close(fd);
});
目錄操作
1.建立目錄
如果檔案已經存在,會報錯
fs.mkdir(`./newdir`,function(err){
if(err) throw err
console.log("make dir success")
})
2.讀取目錄
fs.readdir(`./newdir`,(err,files)=>{
if(err) throw err;
// files 是一個陣列
console.log(Array.isArray(files))
console.log("讀目錄取成功:"+ files);
})
3.刪除目錄
刪除目錄時,如果目錄不是空的將會報錯
fs.rmdir(`./delete_dir`,function(err){
if(err) throw err;
console.log(`delete dir success`)
})
讀取檔案的常用模式
mode 用於建立檔案時給檔案制定許可權,預設0666
flag:
`r` - 以讀取模式開啟檔案。
`r+` - 以讀寫模式開啟檔案。
`rs` - 使用同步模式開啟並讀取檔案。指示作業系統忽略本地檔案系統快取。
`rs+` - 以同步的方式開啟,讀取 並 寫入檔案。
//注意:這不是讓fs.open變成同步模式的阻塞操作。如果想要同步模式請使用fs.openSync()。
`w` - 以讀取模式開啟檔案,如果檔案不存在則建立
`wx` - 和 ` w ` 模式一樣,如果檔案存在則返回失敗
`w+` - 以讀寫模式開啟檔案,如果檔案不存在則建立
`wx+` - 和 ` w+ ` 模式一樣,如果檔案存在則返回失敗
`a` - 以追加模式開啟檔案,如果檔案不存在則建立
`ax` - 和 ` a ` 模式一樣,如果檔案存在則返回失敗
`a+` - 以讀取追加模式開啟檔案,如果檔案不存在則建立
`ax+` - 和 ` a+ ` 模式一樣,如果檔案存在則返回失敗
結束
詳細API 請訪問node官網