fs – file system
fs模塊可以實(shí)現(xiàn)與硬盤的交互
例如文件的創(chuàng)建、刪除、重命名、移動(dòng),
還有文件內(nèi)容的寫入、讀取,以及文件夾的相關(guān)操作
1. 寫入文件
1.1 寫入文件
- 導(dǎo)入fs 模塊
const fs = require('fs');
- 寫入文件
fs.writeFile('./座右銘.txt','三人行,則必有我?guī)熝?,err =>
// err寫入失?。哄e(cuò)誤對(duì)象 寫入成功:nul1
if(err){
console.1og('寫入失敗');
return;
console.1og('寫入成功');
}
);
console.log(1+1);
// 2
// 寫入成功
其實(shí),我們平常文件的保存也是使用了node 的fs 模塊!
1.2 同步和異步
-
異步執(zhí)行
上面我們?cè)趯W(xué)習(xí)寫入模塊時(shí)舉出的案例就時(shí)是異步編程,程序會(huì)先輸出2 的原因是js 文件從上之下執(zhí)行,寫入文件時(shí)時(shí)異步執(zhí)行,就像但與我們之前學(xué)過的setTimeOut 定時(shí)器。 -
同步執(zhí)行
fs.writeFileSync('./data.txt','test');
// 這種方法沒有回調(diào)函數(shù)
此時(shí)程序沒有其他線程,只能等這步代碼執(zhí)行完之后再進(jìn)行下面的程序。
1.3 文件追加寫入
// 第一種方法
fs.appendFile('./座右銘.txt','擇其善者而從之,擇期不善者而改之',err=>{
//判斷
if(err){
console.log('寫入失敗');
return;
}
console.log('追加寫入成功');
});
// 第二種方法
fs.appendFileSync('./座右銘.txt','擇其善者而從之,擇期不善者而改之')
// 第三種方法
fs.appendFile('./座右銘.txt','love love love',{flag: 'a'},err=>{
//判斷
if(err){
console.log('寫入失敗');
return;
}
console.log('\r\n追加寫入成功'); // \r\n 表示換行
});
// 這種方法我們一般在日志使用
1.4 流式寫入
// 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();
之前講過的寫入文件方式都是調(diào)用一次方法寫入一次,會(huì)消耗資源,而這種方法的優(yōu)勢(shì)就是在沒有關(guān)閉通道的時(shí)候,可以一直向文件中寫入內(nèi)容。
1.5 文件寫入的場(chǎng)景
文件寫入在計(jì)算機(jī)中是一個(gè)非常常見的操作,下面的場(chǎng)景都用到了文件寫入
- 下載文件
- 安裝軟件
- 保存程序日志,如Git
- 編輯器保存文件
- 視頻錄制
當(dāng)需要持久化保存數(shù)據(jù)的時(shí)候,應(yīng)該想到文件寫入
2. 讀取文件
2.1 異步和同步讀取
語法: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());
)
})
// 3.同步讀取
let data = fs.readFileSync('./觀書有感.txt');
console.log(data.toString());
2.2 讀取文件應(yīng)用場(chǎng)景
- 電腦開機(jī)
- 程序運(yùn)行
- 編輯器打開文件
- 查看圖片
- 播放視頻
- 播放音樂
- Git 查看日志
- 上傳文件
- 查看聊天記錄
2.3 流式讀取
流式讀取就是相當(dāng)于把文件分成了若干塊兒,一次讀取若干塊兒內(nèi)容。
// 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)
console.log(chunk.length);// 65536字節(jié) = 64KB
// console.log(chunk.toString()); // 視頻信號(hào)不是以字符串的形式存儲(chǔ)的,這樣強(qiáng)制使用UTF-8 形式輸出的內(nèi)容會(huì)亂碼
});
//
console.log(chunk.toString());// 65536 = 64KB
):
// 4.end可選事件
rs.on('end',()=>{
console.1og('讀取完成');
}
2.4 fs 練習(xí) – 文件復(fù)制
// 方式一 readFile
const fs = require('fs');
// 讀取文件內(nèi)容
// let data = fs.readFileSync('../資料/笑看風(fēng)云.mp4');
// 寫入文件
// fs.writeFileSync('../資料/笑看風(fēng)云-2.mp4',data);
console.log(process.memoryUsage());// rss => 整個(gè)文件大小 => 110718784字節(jié) => 105MB
// process.memoryUsage() 獲取文件內(nèi)存
// 方式二 流式操作
// 創(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);
});
rs.on('end',()=>
console.log(process.memoryUsage());//43106304 => 41MB
})
rs.pipe(ws) // 了解即可 也是一種文件寫入流
3. 文件重命名和移動(dòng)
// 文件重命名
// 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('操作成功');
});
4. 文件刪除
// 1.導(dǎo)入fs模塊
const fs require('fs');
// 2.調(diào)用un1ink方法 對(duì)應(yīng)同步操作=>unlinkSync
fs.unlink('./觀書有感.txt',err=>{
if(err){
console.1og('刪除失敗~');
return;
}
console.log('刪除成功');
});
// 1.導(dǎo)入fs模塊
const fs require('fs');
// 2.調(diào)用rm方法 對(duì)應(yīng)同步操作=>rmSync
fs.rm('./觀書有感.txt',err=>{
if(err)
console.1og('刪除失敗~');
return;
console.log('刪除成功);
});
5. 文件夾操作
5.1 創(chuàng)建文件夾
// 1.導(dǎo)入fs模塊
const fs require('fs');
//第一種方法
// 2.創(chuàng)建文件夾mk make制作dir directory文件夾
fs.mkdir('./html',err =>
if(err){
console.1og('創(chuàng)建失敗~');
return;
}
console.1og('創(chuàng)建成功');
})
// 第二種方法 遞歸創(chuàng)建
fs.mkdir('./a/b/c',{recursive: true},err =
if(err){
console.1og('創(chuàng)建失敗~');
return;
}
console.1og('創(chuàng)建成功');
})
5.2 讀取文件夾
//2-3讀取文件夾
// read 讀取 dir directory 文件夾
fs.readdir('./資料',(err,data)=>{
if(err){
console.1og('讀取失敗');
return;
}
console.log(data);
})
fs.readdir('./',(err,data) => {
if(err){
console.1og('讀取失敗');
return
}
console.log(data);
})
5.3 刪除文件夾
// rm => remove
fs.rmdir('./html',err =
if(err){
console.1og('刪除失敗');
return;
console.log('刪除成功');
});
// 遞歸刪除
// 文件夾不為空時(shí)無法刪除
// 不建議使用
fs.rmdir('./a',{recursive:true},err =
if(err){
console.log(err);
return;
console.1og('刪除成功');
});
//建議使用
fs.rm('./a',{recursive:true},err =
if(err){
console.log(err);
return;
console.1og('刪除成功);
})
6. 查看資源狀態(tài)
// 1.導(dǎo)入fs模塊
const fs require('fs');
// 2.stat方法status縮寫狀態(tài)
fs.stat('./資料/笑看風(fēng)云.mp4',(err,data)
=>{
if(err){
console.1og('操作失敗');
return;
}
console.log(data);
// data.file() => 查看是否為文件
// data.isDirectory() => 查看是否為文件夾
})
7. 資源路徑
7.1 路徑使用
// 1.導(dǎo)入fs模塊
const fs require('fs');
// 相對(duì)路徑
// 當(dāng)前文件夾
fs.writeFileSync('./index.html','love');
// fs.writeFileSync('index.html','love');
// 上一級(jí)文件夾
fs.writeFileSync('../index.html','love');
//絕對(duì)路徑
fs.writeFilesync('D:/index.html','love');
// fs.writeFileSync('C:/index.html','love'); 報(bào)錯(cuò) 權(quán)限不允許
7.2 相對(duì)路徑的bug
現(xiàn)有文件夾目錄如下:
執(zhí)行以下代碼:
const fs = require('fs');
fs.writeFileSync('./index.html','love');
為什么index.html 創(chuàng)建在了代碼的同級(jí)目錄下呢?這是因?yàn)?strong>相對(duì)路徑的參照物是命令行的工作目錄。
要解決這個(gè)問題就要轉(zhuǎn)換為絕對(duì)路徑:
我們每次去寫絕對(duì)變量都需要寫好長(zhǎng)一段,但是使用__dirname(可以理解為全局變量,保存的是所在文件的所在目錄的絕對(duì)路徑)
console.log(__dirname);
fs.writeFileSync(__dirname + '/index.html','love');
7.3 fs 練習(xí) – 批量重命名
const fs = require('fs');
const files fs.readdirSync('./code');
// 遍歷數(shù)組
files.forEach(item =>{
// 拆分文件名
let data = item.split('-');
let [num,name] = data;
// 判斷
if(Number(num) < 10){
num = '0' + num;
//創(chuàng)建新的文件名
let newName = num +'-' +name;
//重命名
fs.renameSync(`./code/${item}`,`./code/${newName}`);
})
思考:
如果將02 文件刪除,那么怎么將文件名稱03變02,以此類推將下面所有的文件名稱修改,接著排序。文章來源:http://www.zghlxwxcb.cn/news/detail-857588.html
答案在資料中。文章來源地址http://www.zghlxwxcb.cn/news/detail-857588.html
到了這里,關(guān)于Node.js -- fs模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!