學(xué)習(xí)視頻:尚硅谷2023版Node.js零基礎(chǔ)視頻教程,nodejs新手到高手
- fs:
file system
,文件系統(tǒng)。- fs模塊可以實(shí)現(xiàn)與硬盤的交互,例如文件的創(chuàng)建、刪除、重命名、移動(dòng)、內(nèi)容的寫入讀取以及文件夾的相關(guān)操作。
??文件寫入
??writeFile 異步寫入
-
語法:
fs.writeFile(file,data[,options],callback)
-
參數(shù)說明:
-
file
文件名 -
data
待寫入的數(shù)據(jù) -
options
選項(xiàng)設(shè)置(可選) -
callback
寫入回調(diào)
-
-
返回值:
undefined
/** * 需求: * 新建一個(gè)文件, 座右銘.txt, 寫入內(nèi)容, 三人行, 則必有我?guī)熝? */ //1. 導(dǎo)入 fs 模塊 const fs = require('fs'); //2. 寫入文件 fs.writeFile('./座右銘.txt', '三人行, 則必有我?guī)熝?, err => { // err(回調(diào)函數(shù))寫入失敗: 錯(cuò)誤對(duì)象 寫入成功: null if(err){ console.log('寫入失敗'); return; } console.log('寫入成功'); });
-
異步
:如下,1+1在最后,但它壓根不帶等上邊的,它倆一塊運(yùn)行,誰也不妨礙誰,1+1先跑完就先輸出。/** * 需求: * 新建一個(gè)文件, 座右銘.txt, 寫入內(nèi)容, 三人行, 則必有我?guī)熝? */ //1. 導(dǎo)入 fs 模塊 const fs = require('fs'); //2. 寫入文件 fs.writeFile('./座右銘.txt', '三人行, 則必有我?guī)熝?, err => { // err(回調(diào)函數(shù))寫入失敗: 錯(cuò)誤對(duì)象 寫入成功: null if(err){ console.log('寫入失敗'); return; } console.log('寫入成功'); }); console.log(1 + 1);
??writeFileSync 同步寫入
-
語法:
fs.writeFileSync(file, data[, options])
-
參數(shù)與 fs.writeFile 大體一致,只是沒有 callback 參數(shù)。
-
返回值:
undefined
//1. 導(dǎo)入 fs 模塊 const fs = require('fs'); //2. 寫入文件 //同步寫入 fs.writeFileSync('./data.txt', 'test'); console.log(1 + 1);
-
同步
:就是一條道,我走完你再走,從上到下順序執(zhí)行。/** * 需求: * 新建一個(gè)文件, 座右銘.txt, 寫入內(nèi)容, 三人行, 則必有我?guī)熝? */ //1. 導(dǎo)入 fs 模塊 const fs = require('fs'); //2. 寫入文件 //同步寫入 try{ fs.writeFileSync('./座右銘.txt', '三人行,必有我?guī)熝伞?); console.log('OK'); } catch(e){ console.log(e); } console.log(1 + 1);
Node.js 中的磁盤操作是由其他線程完成的,結(jié)果的處理有兩種模式:
-
同步處理
:JavaScript主線程會(huì)等待其他線程的執(zhí)行結(jié)果,然后再繼續(xù)執(zhí)行主線程的代碼,效率較低。 -
異步處理
:JavaScript主線程不會(huì)等待其他線程的執(zhí)行結(jié)果,直接執(zhí)行后續(xù)的主線程代碼,效率較好。
??appendFile / appendFileSync 追加寫入
-
appendFile 作用是在文件尾部追加內(nèi)容,appendFile 語法與 writeFile 語法完全相同。
-
語法:
fs.appendFile(file, data[, options], callback)
fs.appendFileSync(file, data[, options])
-
返回值: 二者都為
undefined
//1. 引入 fs 模塊 const fs = require('fs'); //2. 調(diào)用 appendFile fs.appendFile('./座右銘.txt', ',擇其善者而從之, 擇期不善者而改之', err => { //判斷 if(err){ console.log('寫入失敗~~'); return; } console.log('追加寫入成功'); }); fs.appendFileSync('./座右銘.txt', '\r\n溫故而知新, 可以為師矣') //writeFile 實(shí)現(xiàn)追加寫入 fs.writeFile('./座右銘.txt', 'love love love',{flag: 'a'}, err => { if(err) { console.log('寫入失敗~'); return ; } console.log('寫入成功'); });
??createWriteStream 流式寫入
-
語法:
fs.createWriteStream(path[, options])
-
參數(shù)說明:
-
path
:文件路徑 -
options
:選項(xiàng)配置( 可選 )
-
-
返回值:
Object
//1. 導(dǎo)入 fs const fs = require('fs'); //2. 創(chuàng)建寫入流對(duì)象 const ws = fs.createWriteStream('./觀書有感.txt'); //3. write ws.write('半畝方塘一鑒開\r\n'); ws.write('天光云影共徘徊\r\n'); ws.write('問渠那得清如許\r\n'); ws.write('為有源頭活水來\r\n'); //4. 關(guān)閉通道 ws.close();
- 程序打開一個(gè)文件是需要消耗資源的 ,流式寫入可以減少打開關(guān)閉文件的次數(shù)。
- 流式寫入方式適用于大文件寫入或者頻繁寫入的場(chǎng)景, writeFile 適合于寫入頻率較低的場(chǎng)景。
??寫入文件的場(chǎng)景
??文件讀取
?? readFile 異步讀取
-
語法:
fs.readFile(path[, options], callback)
-
參數(shù)說明:
-
path
:文件路徑 -
options
:選項(xiàng)配置 -
callback
:回調(diào)函數(shù)
-
-
返回值:
undefined
//1. 引入 fs 模塊 const fs = require('fs'); //2. 異步讀取 fs.readFile('./觀書有感.txt', (err, data) => { if(err) { console.log('讀取失敗~~'); return; } console.log(data.toString()); });
??readFileSync 同步讀取
-
語法:
fs.readFileSync(path[, options])
-
參數(shù)說明:
-
path
:文件路徑 -
options
:選項(xiàng)配置
-
-
返回值:
string | Buffer
//1. 引入 fs 模塊 const fs = require('fs'); //2. 同步讀取 let data = fs.readFileSync('./觀書有感.txt'); console.log(data.toString());
??createReadStream 流式讀取
-
語法:
fs.createReadStream(path[, options])
-
參數(shù)說明:
-
path
:文件路徑 -
options
:選項(xiàng)配置( 可選 )
-
-
返回值:
Object
//1. 引入 fs 模塊 const fs = require('fs'); //2. 創(chuàng)建讀取流對(duì)象 const rs = fs.createReadStream('../資料/笑看風(fēng)云.mp4'); //3. 綁定 data 事件 chunk 塊兒 大塊兒 rs.on('data', chunk => { console.log(chunk.length); // 65536 字節(jié) => 64KB,每次讀取64KB的數(shù)據(jù) }); //4. end 可選事件 rs.on('end', () => { console.log('讀取完成'); });
- 讀取文件應(yīng)用場(chǎng)景
![]()
??fs文件練習(xí)——文件復(fù)制
/**
* 需求:
* 復(fù)制『資料』文件夾下的『笑看風(fēng)云.mp4』
*/
const fs = require('fs');
//方式一 readFile
//讀取文件內(nèi)容
let data = fs.readFileSync('../資料/笑看風(fēng)云.mp4');
//寫入文件
fs.writeFileSync('../資料/笑看風(fēng)云-2.mp4', data);
//方式二 流式操作
//創(chuàng)建讀取流對(duì)象
const rs = fs.createReadStream('../資料/笑看風(fēng)云.mp4');
//創(chuàng)建寫入流對(duì)象
const ws = fs.createWriteStream('../資料/笑看風(fēng)云-3.mp4');
//綁定 data 事件
rs.on('data', chunk => {
ws.write(chunk);
});
查看內(nèi)存占用量
const fs = require('fs');
const process = require('process');
//方式一 readFile
let data = fs.readFileSync('../資料/笑看風(fēng)云.mp4');
fs.writeFileSync('../資料/笑看風(fēng)云-2.mp4', data);
console.log("我是readfile的結(jié)果");
console.log(process.memoryUsage());
//方式二 流式操作
const rs = fs.createReadStream('../資料/笑看風(fēng)云.mp4');
const ws = fs.createWriteStream('../資料/笑看風(fēng)云-3.mp4');
//綁定 data 事件(2.1)
rs.on('data', chunk => {
ws.write(chunk);
});
rs.on('end', () => {
console.log("我是流式讀取的結(jié)果");
console.log(process.memoryUsage());
})
//(2.2),借助管道完成讀取
// rs.pipe(ws);
視頻里頭流式處理可厲害了,我這咋流式處理菜菜的?- 流式處理所占用的內(nèi)存比直接讀取更大是因?yàn)榱魇教幚硇枰谔幚頂?shù)據(jù)時(shí)逐行或逐塊讀取數(shù)據(jù),并將其存儲(chǔ)在內(nèi)存中以進(jìn)行后續(xù)處理。這意味著在讀取數(shù)據(jù)時(shí),需要維護(hù)一個(gè)緩沖區(qū)來存儲(chǔ)數(shù)據(jù),因此在處理大量數(shù)據(jù)時(shí),內(nèi)存的使用率可能比直接讀取更高。
- 另外,流式處理還需要在處理后及時(shí)釋放內(nèi)存,否則可能會(huì)導(dǎo)致內(nèi)存泄漏和程序崩潰等問題。因此,在設(shè)計(jì)流式處理程序時(shí)需要特別注意內(nèi)存的使用和釋放問題,以確保程序的穩(wěn)定性和可靠性。
??文件移動(dòng)與重命名
- 在 Node.js 中,我們可以使用
rename
或renameSync
來移動(dòng)或重命名 文件或文件夾 -
語法:
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
-
參數(shù)說明:
-
oldPath
:文件當(dāng)前的路徑 -
newPath
:文件新的路徑 -
callback
:操作后的回調(diào)
//1. 導(dǎo)入 fs 模塊 const fs = require('fs'); //2. 調(diào)用 rename 方法 fs.rename('./座右銘.txt', './論語.txt', err => { if(err) { console.log('操作失敗~'); return; } console.log('操作成功'); }); //文件的移動(dòng) fs.rename('./data.txt', '../資料/data.txt', err => { if(err) { console.log('操作失敗~'); return; } console.log('操作成功'); })
-
??文件刪除
- 在 Node.js 中,我們可以使用
unlink
或unlinkSync
或rm
或rmSync
來刪除文件。 -
語法:
fs.unlink(path, callback)
fs.unlinkSync(path)
fs.rm(path, callback)
fs.rmSync(path)
-
參數(shù)說明:
-
path
:文件路徑 -
callback
:操作后的回調(diào)
//1. 導(dǎo)入 fs 模塊 const fs = require('fs'); //2. (一)調(diào)用 unlink 方法 unlinkSync fs.unlink('./觀書有感.txt', err => { if(err) { console.log('刪除失敗~'); return; } console.log('刪除成功'); }); // 2. (二)調(diào)用 rm 方法 rmSync fs.rm('./論語.txt', err => { if (err) { console.log('刪除失敗~'); return; } console.log('刪除成功'); })
-
??文件夾操作
補(bǔ)充筆記:常用的 Linux 操作
??mkdir 創(chuàng)建文件夾
- 在 Node.js 中,我們可以使用
mkdir
或mkdirSync
來創(chuàng)建文件夾 -
語法:
fs.mkdir(path[, options], callback)
fs.mkdirSync(path[, options])
-
參數(shù)說明:
-
path
:文件夾路徑 -
options
:選項(xiàng)配置( 可選 ) -
callback
:操作后的回調(diào)
-
??readdir 讀取文件夾
- 在 Node.js 中,我們可以使用
readdir
或readdirSyn
來創(chuàng)建文件夾 -
語法:
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
-
參數(shù)說明:
-
path
:文件夾路徑 -
options
:選項(xiàng)配置( 可選 ) -
callback
:操作后的回調(diào)
-
??rmdir 刪除文件夾
- 在 Node.js 中,我們可以使用
rmdir
或rmdirSync
來創(chuàng)建文件夾 -
語法:
fs.rmdir(path[, options], callback)
fs.rmdirSync(path[, options])
-
參數(shù)說明:
-
path
:文件夾路徑 -
options
:選項(xiàng)配置( 可選 ) -
callback
:操作后的回調(diào)
-
//1. 導(dǎo)入 fs 模塊
const fs = require('fs');
//2. 創(chuàng)建文件夾 mk make 制作 dir directory 文件夾
fs.mkdir('./html', err => {
if(err) {
console.log('創(chuàng)建失敗~');
return;
}
console.log('創(chuàng)建成功');
});
//2-2 遞歸創(chuàng)建
fs.mkdir('./a/b/c', {recursive: true},err => {
if(err) {
console.log('創(chuàng)建失敗~');
return;
}
console.log('創(chuàng)建成功');
});
//2-3 讀取文件夾 read 讀取 dir directory 文件夾
fs.readdir('../資料', (err, data) => {
if(err){
console.log('讀取失敗');
return;
}
console.log(data);
});
fs.readdir('./', (err, data) => {
if(err){
console.log('讀取失敗');
return;
}
console.log(data);
});
//2-4 刪除文件夾 rm remove 移除
fs.rmdir('./html', err => {
if(err){
console.log('刪除失敗');
return;
}
console.log('刪除成功');
});
//遞歸刪除 不推薦使用
// fs.rmdir('./a', {recursive: true},err => {
// if(err){
// console.log(err);
// return;
// }
// console.log('刪除成功');
// });
//建議使用
fs.rm('./a', {recursive: true},err => {
if(err){
console.log(err);
return;
}
console.log('刪除成功');
});
??fs文件練習(xí)——批量重命名
-
需求:批量重命名,把1、2等變?yōu)?1、02等,可應(yīng)用于防止網(wǎng)盤文件錯(cuò)位。
//導(dǎo)入 fs 模塊 const fs = require('fs'); //讀取 code 文件夾 const files = fs.readdirSync('./code'); //遍歷數(shù)組 files.forEach(item => { //拆分文件名 let data = item.split('-'); let [num, name] = data;//num存數(shù)字,name存文件名 //判斷 if(Number(num) < 10){ num = '0' + num; } //創(chuàng)建新的文件名 let newName = num + '-' + name; //重命名 fs.renameSync(`./code/${item}`, `./code/${newName}`); })
-
需求:批量重命名并排好序,比如1、3、4變?yōu)?1、02、03。
//導(dǎo)入 fs 模塊 const fs = require('fs'); //讀取 code 文件夾 const files = fs.readdirSync('./code'); //遍歷數(shù)組 files.forEach((item, index) => { //拆分 let [num, name] = item.split('-'); //index 自增 index++; //判斷 index = index < 10 ? '0' + index : index; //拼接新的名字 let newName = index + '-' + name; //移動(dòng)文件 fs.renameSync(`./code/${item}`, `./code/${newName}`); });
??查看資源狀態(tài)
-
在 Node.js 中,我們可以使用
stat
或statSync
來創(chuàng)建文件夾 -
語法:
fs.stat(path[, options], callback)
fs.statSync(path[, options])
-
參數(shù)說明:
-
path
:文件夾路徑 -
options
:選項(xiàng)配置( 可選 ) -
callback
:操作后的回調(diào)
//1. 導(dǎo)入 fs 模塊 const fs = require('fs'); //2. stat 方法 status 縮寫 狀態(tài) fs.stat('../資料/笑看風(fēng)云.mp4', (err, data) => { if(err){ console.log('操作失敗'); return; } console.log(data); console.log(data.isFile()); console.log(data.isDirectory()); });
-
size
文件體積 -
birthtime
創(chuàng)建時(shí)間 -
mtime
最后修改時(shí)間 -
isFile
檢測(cè)是否為文件 -
isDirectory
檢測(cè)是否為文件夾
-
??相對(duì)路徑問題
學(xué)習(xí)html圖片標(biāo)簽時(shí)對(duì)相對(duì)路徑問題有過介紹文章來源:http://www.zghlxwxcb.cn/news/detail-654942.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-654942.html
??_dirname全局變量
-
__dirname
與require
類似,都是 Node.js 環(huán)境中的全局變量 -
__dirname
保存著當(dāng)前文件所在目錄的絕對(duì)路徑 ,可以使用__dirname
與文件名拼接成絕對(duì)路徑
到了這里,關(guān)于Node.js |(二)Node.js API:fs模塊 | 尚硅谷2023版Node.js零基礎(chǔ)視頻教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!