1. fs模塊
fs
全稱為file system
,稱之為 文件系統(tǒng) ,是Node.js
中的 內(nèi)置模塊 ,可以對(duì)計(jì)算機(jī)中的磁盤進(jìn)行操
作。
1. 文件寫入
文件寫入就是將 數(shù)據(jù) 保存到 文件 中,我們可以使用如下幾個(gè)方法來實(shí)現(xiàn)該效果
方法 | 說明 |
---|---|
writeFile |
異步寫入 |
writeFileSync |
同步寫入 |
appendFile/appendFileSync |
追加寫入 |
createWriteStream |
流式寫入 |
1.1 writeFile
異步寫入
- 語(yǔ)法:
fs.writeFile(file, data[, options], callback)
- 參數(shù)說明:
-
file
: 文件名 -
data
: 待寫入的數(shù)據(jù) -
option
: 選項(xiàng)配置-
encoding <string> | <null>
默認(rèn)值:'utf8'
-
mode <integer>
默認(rèn)值:0o666
-
flag <string>
默認(rèn)值:'w'
。-
'a'
:打開文件進(jìn)行追加。如果文件不存在,則創(chuàng)建該文件。 -
'a+'
:打開文件進(jìn)行讀取和追加。如果文件不存在,則創(chuàng)建該文件。 -
'r'
:打開文件進(jìn)行讀取。如果文件不存在,則會(huì)發(fā)生異常。 -
'w'
:打開文件進(jìn)行寫入。創(chuàng)建(如果它不存在)或截?cái)啵ㄈ绻嬖冢┰撐募?/li> -
'w+'
:打開文件進(jìn)行讀寫。創(chuàng)建(如果它不存在)或截?cái)啵ㄈ绻嬖冢┰撐募?/li> - …
-
-
flush <boolean>
如果所有數(shù)據(jù)都成功寫入文件,并且flush
是true
,則使用filehandle.sync()
來刷新數(shù)據(jù)。默認(rèn)值:false
。 -
signal <AbortSignal>
允許中止正在進(jìn)行的寫入文件
-
-
callback
: 寫入回調(diào)
-
- 返回值:
undefined
- 代碼示例:
// 1. 導(dǎo)入fs模塊
// require 是 Node.js 環(huán)境中的'全局'變量,用來導(dǎo)入模塊
const fs = require('fs')
// 2. 寫入文件
// 文件不存在,會(huì)自動(dòng)創(chuàng)建
fs.writeFile('./文件寫入.txt', '三人行,必有我?guī)熝?, err => {
// err寫入失?。哄e(cuò)誤對(duì)象 寫入成功: null
if(err){
console.log('寫入失敗')
return
}
console.log('寫入成功')
})
1.2 writeFileSync
同步寫入
- 語(yǔ)法:
fs.writeFileSync(file, data[, options])
參數(shù)與
fs.writeFile
大體一致,只是沒有callback
參數(shù)
- 返回值:
undefined
- 代碼示例:
try{
fs.writeFileSync('./座右銘.txt', '三人行,必有我?guī)熝伞?);
}catch(e){
console.log(e);
}
Node.js
中的磁盤操作是由其他 線程 完成的,結(jié)果的處理有兩種模式:
- 同步處理
J
avaScript` 主線程 會(huì)等待 其他線程的執(zhí)行結(jié)果,然后再繼續(xù)執(zhí)行主線程的代碼,
效率較低- 異步處理
JavaScript
主線程 不會(huì)等待 其他線程的執(zhí)行結(jié)果,直接執(zhí)行后續(xù)的主線程代碼,
效率較好
1.3 appendFile/appendFileSync
追加寫入
-
appendFile
作用是在文件尾部追加內(nèi)容,appendFile
語(yǔ)法與writeFile
語(yǔ)法完全相同
語(yǔ)法:
fs.appendFile(file, data[, options], callback)
fs.appendFileSync(file, data[, options])
- 返回值:
undefined
- 示例代碼:
let fs = require('fs')
// 異步追加
fs.appendFile('./文件寫入.txt', '\r\nappend追加的內(nèi)容', err => {
if(err){
console.log('appendFile追加失敗')
return
}
console.log('appendFile追加成功')
})
// 同步追加
fs.appendFileSync('./文件寫入.txt', '\r\nappendFileSync追加的內(nèi)容')
// writeFile追加內(nèi)容
fs.writeFile('./文件寫入.txt', '\r\nwriteFile追加的內(nèi)容',{flag: 'a'}, err => {
if(err){
console.log('writeFile追加失敗')
return
}
console.log('writeFile追加成功')
})
fs.writeFileSync('./文件寫入.txt', '\r\nwriteFileSync追加的內(nèi)容',{flag: 'a'})
1.4 createWriteStream
流式寫入
- 語(yǔ)法:
fs.createWriteStream(path[, options])
- 參數(shù)說明:
-
path
: 文件路徑 -
options
: 選項(xiàng)配置
-
- 返回值:
Object
- 代碼示例:
// 1. 引入fs模塊
const fs = require('fs')
// 2. 創(chuàng)建寫入流對(duì)象
const ws = fs.createWriteStream('./詠鵝.txt')
// 3. write寫入內(nèi)容
ws.write('鵝鵝鵝\r\n')
ws.write('曲項(xiàng)向天歌\r\n')
ws.write('白毛浮綠水\r\n')
ws.write('紅掌撥清波\r\n')
// 4. 關(guān)閉通道
ws.end()
// ws.close()
程序打開一個(gè)文件是需要消耗資源的 ,流式寫入可以減少打開關(guān)閉文件的次數(shù)。
流式寫入方式適用于 大文件寫入或者頻繁寫入 的場(chǎng)景,writeFile
適合于 寫入頻率較低的場(chǎng)景
1.5 寫入文件的場(chǎng)景
- 文件寫入 在計(jì)算機(jī)中是一個(gè)非常常見的操作,下面的場(chǎng)景都用到了文件寫入
- 下載文件
- 安裝軟件
- 保存程序日志,如
Git
- 編輯器保存文件
- 視頻錄制
當(dāng) 需要持久化保存數(shù)據(jù) 的時(shí)候,應(yīng)該想到 文件寫入
2. 文件讀取
文件讀取顧名思義,就是通過程序從文件中取出其中的數(shù)據(jù),我們可以使用如下幾種方式:
方法 | 說明 |
---|---|
readFile |
異步讀取 |
readFileSync |
同步讀取 |
createReadStream |
流式讀取 |
1.1 readFile
異步讀取
- 語(yǔ)法:
fs.readFile(path, [, options], callback)
- 參數(shù)說明:
-
path
: 文件路徑 -
options
: 選項(xiàng)配置 -
callback
: 回調(diào)函數(shù)
-
- 返回值:
undefined
- 代碼示例:
const fs = require('fs')
// 異步讀取
fs.readFile('./詠鵝.txt', err => {
if(err){
console.log('讀取失敗')
}
console.log('讀取成功')
})
1.2 readFileSync
同步讀取
- 語(yǔ)法:
fs.readFileSync(path, [, options])
- 參數(shù)說明:
-
path
: 文件路徑 -
options
: 選項(xiàng)配置
-
- 返回值:
string | Buffer
- 代碼示例:
// 同步讀取
const ds = fs.readFileSync('./詠鵝.txt')
const dsf = fs.readFileSync('./詠鵝.txt', 'utf-8')
console.log(ds.toString(), '-----')
console.log(dsf.toString())
1.3 文件流式讀取
- 語(yǔ)法:
fs.createReadStream(path, [, options])
- 參數(shù)說明:
-
path
: 文件路徑 -
options
: 選項(xiàng)配置
-
- 返回值:
Object
- 代碼示例:
// 創(chuàng)建讀取流讀寫
const rs = fs.createReadStream('../資料/笑看風(fēng)云.mp4')
// 每次取出64kb, 后執(zhí)行回調(diào)一次
rs.on('data', thunk => {
console.log(thunk.length) // 65536 字節(jié) => 64KB
})
// 讀取完畢后,調(diào)取end回調(diào)(可選事件)
rs.on('end', ()=>{
console.log('讀取完畢')
})
1.4 讀取文件應(yīng)用場(chǎng)景
電腦開機(jī)
程序運(yùn)行
編輯器打開文件
查看圖片
播放視頻
播放音樂
Git 查看日志
上傳文件
查看聊天記錄
3. 文件移動(dòng)與重命名
在
Node.js
中,我們可以使用rename
或renameSync
來移動(dòng)或重命名 文件或文件夾rename
不會(huì)創(chuàng)建文件目錄
- 語(yǔ)法:
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
- 參數(shù)說明:
-
oldPath
: 文件當(dāng)前路徑 -
newPath
: 文件新的路徑 -
callback
: 操作后的回調(diào)
-
- 代碼示例:
// fs.rename('./詠鵝.txt', './詠鵝-駱賓王.txt', err => {
// if(err){
// console.log('重命名失敗')
// }
// console.log('重命名成功')
// })
fs.rename('./詠鵝.txt', './資料/詠鵝-駱賓王.txt', err => {
if(err){
console.log('移動(dòng)失敗')
return
}
console.log('移動(dòng)成功')
})
4. 文件刪除
在
Node.js
中,我們可以使用unlink
或unlinkSync
來刪除文件
- 語(yǔ)法:
fs.unlink(path, callback)
fs.unlinkSync(path)
- 參數(shù)說明:
-
path
: 文件操作路徑 -
callback
: 操作后的回調(diào)
-
- 代碼示例:
// fs.unlink('./文件寫入.txt', err => {
// if(err){
// console.log('刪除失敗')
// return
// }
// console.log('刪除成功')
// })
fs.rm('./文件寫入.txt', err => {
if(err){
console.log('刪除失敗')
return
}
console.log('刪除成功')
})
5. 文件夾操作
借助
Node.js
的能力,我們可以對(duì)文件夾進(jìn)行 創(chuàng)建 、 讀取 、 刪除 等操作
方法 | 說明 |
---|---|
mkdir/mkdirSync |
創(chuàng)建文件夾 |
readdir/readdirSync |
讀取文件夾 |
rmdir/rmdirSync 、rm/rmSync
|
刪除文件夾 |
1.1 mkdir
創(chuàng)建文件夾
在
Node.js
中,我們可以使用mkdir
或mkdirSync
來創(chuàng)建文件夾
- 語(yǔ)法:
fs.mkdir(path, [, options], callback)
fs.mkdirSync(path, [, options])
- 參數(shù)說明:
-
path
: 文件路徑 -
options
: 選項(xiàng)配置-
recursive
: 是否遞歸
-
-
callback
: 回調(diào)函數(shù)
-
- 代碼示例:
// 創(chuàng)建目錄
fs.mkdir('./html', err => {
if(err){
console.log('創(chuàng)建失敗')
return
}
console.log('創(chuàng)建成功')
})
// 遞歸創(chuàng)建
fs.mkdir('./a/b/c',{recursive: true}, err=>{
if(err){
console.log('創(chuàng)建失敗')
return
}
console.log('創(chuàng)建成功')
})
1.2 readdir
讀取文件夾
在
Node.js
中,我們可以使用readdir
或readdirSync
來讀取文件夾
- 語(yǔ)法:
fs.readdir(path, [, options], callback)
fs.readdir(path, [, options])
- 參數(shù)說明:
-
path
: 文件路徑 -
options
: 選項(xiàng)配置 -
callback
: 回調(diào)函數(shù)
-
- 返回值:
undefined
- 代碼示例:
const fs = require('fs')
// 讀取目錄
fs.readdir('./', (err, data)=>{
if(err){
console.log('讀取失敗')/ return
}
console.log('讀取成功', data)
})
1.3 rmdir
刪除文件夾(使用.rm
加配置項(xiàng)recursive
)
在
Node.js
中,我們可以使用rmdir
或rmdirSync
(rm
或rmSync
) 來刪除文件夾
- 語(yǔ)法:
fs.rmdir(path, [, options], callback)
fs.rmdirSync(path, [, options])
- 參數(shù)說明:
-
path
: 文件路徑 -
options
: 選項(xiàng)配置-
recursive
: 是否遞歸
-
-
callback
: 回調(diào)函數(shù)
-
- 代碼示例:
const fs = require('fs')
// 刪除目錄
// fs.rmdir('./html', err => {
fs.rm('./html',{recursive: true}, err => {
if(err){
console.log('刪除失敗')
return
}
console.log('刪除成功')
})
// 遞歸刪除
// .rmdir 會(huì)提示被.rm替代
// fs.rmdir('./a',{recursive: true}, err => {
fs.rm('./a',{recursive: true}, err => {
if(err){
console.log('刪除失敗')
return
}
console.log('刪除成功')
})
6. 查看資源狀態(tài)
在
Node.js
中,我們可以使用stat
或statSync
來查看資源的詳細(xì)信息
- 語(yǔ)法:
fs.stat(path[, options], callback)
fs.statSync(path[, options])
- 參數(shù)說明:
-
path
文件夾路徑 -
options
選項(xiàng)配置( 可選 ) -
callback
操作后的回調(diào)
-
- 示例代碼:
fs.stat('./文件寫入.txt', (err, data) => {
if(err){
console.log(err)
return
}
console.log(data)
console.log(data.isFile())
console.log(data.isDirectory())
})
- 結(jié)果值對(duì)象結(jié)構(gòu):
-
size
文件體積 -
birthtime
創(chuàng)建時(shí)間 -
mtime
最后修改時(shí)間 -
isFile
檢測(cè)是否為文件 -
isDirectory
檢測(cè)是否為文件夾
-
7. 相對(duì)路徑問題
fs
模塊對(duì)資源進(jìn)行操作時(shí),路徑的寫法有兩種:
- 相對(duì)路徑
-
./座右銘.txt
當(dāng)前目錄下的座右銘.txt
-
座右銘.txt
等效于上面的寫法 -
../座右銘.txt
當(dāng)前目錄的上一級(jí)目錄中的座右銘.txt
-
- 絕對(duì)路徑
-
D:/Program Files
windows
系統(tǒng)下的絕對(duì)路徑 -
/usr/bin
Linux
系統(tǒng)下的絕對(duì)路徑
-
相對(duì)路徑中所謂的 當(dāng)前目錄 ,指的是 命令行的工作目錄 ,而并非是文件的所在目錄
所以當(dāng)命令行的工作目錄與文件所在目錄不一致時(shí),會(huì)出現(xiàn)一些 BUG
8. __dirname
__dirname
與 require
類似,都是 Node.js
環(huán)境中的’全局’變量__dirname
保存著 當(dāng)前文件所在目錄的絕對(duì)路徑 ,可以使用 __dirname
與文件名拼接成絕對(duì)路徑
代碼示例:
console.log(__dirname)
fs.writeFileSync(__dirname + '/文件寫入.txt', '三人行,必有我?guī)熝?)
使用
fs
模塊的時(shí)候,盡量使用__dirname
將路徑轉(zhuǎn)化為絕對(duì)路徑,這樣可以避免相對(duì)路徑產(chǎn)生的Bug
文章來源:http://www.zghlxwxcb.cn/news/detail-804671.html
9. 案例:文件批量重命名
/*
* 文件名 1 2 3 ... 改成 01 02 03 ...
*/
const fs = require('fs')
const dir = fs.readdirSync('./')
dir.forEach(item => {
const fileName = item.split('-')
let [num, name] = fileName
if(Number(num) < 10){
num = '0' + num
}
const newName = num + '-' + name
console.log(newName, 'sss')
fs.renameSync(`./${item}`, `./${newName}`)
});
2. path模塊
path
模塊提供了 操作路徑 的功能,我們將介紹如下幾個(gè)較為常用的幾個(gè)API
:文章來源地址http://www.zghlxwxcb.cn/news/detail-804671.html
API |
說明 |
---|---|
path.resolve |
拼接規(guī)范的絕對(duì)路徑(常用) |
path.sep |
獲取操作系統(tǒng)的路徑分隔符 |
path.parse |
解析路徑并返回對(duì)象 |
path.basename |
獲取路徑的基礎(chǔ)名稱 |
path.dirname |
獲取路徑的目錄 |
path.extname |
獲取路徑的擴(kuò)展名 |
代碼示例: |
const fs =require('fs')
const path = require('path')
// 寫入文件
fs.writeFileSync(__dirname+'/index.txt', 'hello')
console.log(__dirname+'/index.txt') // D:\Note\node-note\03_path模塊/index.txt
// 1. resolve 解決
// 第一個(gè)參數(shù)一般是絕對(duì)路徑,后續(xù)的參數(shù)是相對(duì)路徑
console.log(path.resolve(__dirname, './index.txt')) //D:\Note\node-note\03_path模塊\index.txt
// console.log(path.resolve(__dirname, './index.txt', 'A.HTML')) //D:\Note\node-note\03_path模塊\index.txt\A.HTML
// console.log(path.resolve(__dirname, '/index.txt', 'A.HTML')) //D:\index.txt\A.HTML
// 2. sep 系統(tǒng)的分隔符
console.log(path.sep) // Windows \ Linux /
// 3. parse 解析路徑返回對(duì)象
// __dirname 返回文件目錄的決定路徑
console.log(__dirname) //D:\Note\node-note\03_path模塊
// __filename 返回文件的決定路徑
console.log(__filename) //D:\Note\node-note\03_path模塊\path.js
const str = 'D:\\Note\\node-note\\03_path模塊\\path.js'
console.log(path.parse(str))
/*{
root: 'D:\\',
dir: 'D:\\Note\\node-note\\03_path模塊',
base: 'path.js',
ext: '.js',
name: 'path'
}*/
console.log(path.basename(str)) // 獲取基礎(chǔ)文件名字
console.log(path.dirname(str)) // 獲取目錄名
console.log(path.extname(str)) // 獲取擴(kuò)展名
到了這里,關(guān)于nodejs學(xué)習(xí)計(jì)劃--(二)fs文件系統(tǒng)和path模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!