0x00 fs模塊的引入
fs模塊是nodejs的核心模塊,不需要通過npm進行安裝即可使用,使用方法爲
const fs = require('fs')
0x01 fs模塊中函數介紹
1. fs.stat(path,callback)
stat函數實現的功能是讀取文件的狀態,注意,stat函數是異步操作,若需使用同步操作,需要使用匿名自執行函數來模擬同步。
例:
fs.stat('test',(err,stats)=>{
if(err)
{
console.log(err);
return false;
}
console.log('文件:' + stats.isFile());
console.log('目錄:' + stats.isDirectory());
})//注意stat()是異步操作
2 fs.mkdir(path,callback)
mkdir實現的功能是創建一個目錄,若創建已有的目錄會報錯
例:
fs.mkdir('fs01',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('創建目錄成功');
})
3 fs.writeFile(path,data,callback)
writeFile是寫入數據到指定文件,會覆蓋掉文件以前的數據,若沒有文件則會創建文件。
例:
fs.writeFile('fs01/writeFile.txt','hello world',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('寫入成功');
})
4 fs.appendFile(file,data,callback)
appendFile不會覆蓋以前的數據,而是將數據加到原文件後面。
例:
fs.appendFile('fs01/writeFile.txt','\n這是新加的內容',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('追加內容成功');
})
5 fs.readFile(path,callback)
readFile將指定文件內容讀入data中
例:
fs.readFile('fs01/writeFile.txt',(err, data) =>{
if(err)
{
console.log(err);
return false;
}
else
console.log(data.toString());
})
6 fs.readdir(path,callback)
readdir將指定目錄讀入data中,data中保存了該目錄下的文件與文件夾
例:
fs.readdir('fs01',(err,data)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log(data);
})
7 fs.rename(oldpath,newpath,callback)
rename可以更改文件的名字,也可以用來更改文件的地址
例:
fs.rename('fs01/new 2.txt','./fs01/rename.txt',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('改名成功');
})//也可用來更換文件地址
8 fs.rmdir
rmdir刪除指定目錄,注意,不能刪文件
例:
fs.rmdir('fs',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('成功刪除');
})//只用來刪目錄,刪文件用unlink
9 fs.unlink(path,callback)
unlink刪除指定文件,不能刪目錄
例:
fs.unlink('fs01/writeFile.txt',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('成功刪除');
})
0x02 fs demo-幾個小功能的實現
1 判斷是否有某目錄,如果沒有則創建
var fs = require('fs');
fs.stat('Upload',(err,stats)=>{
if(err)
{
fs.mkdir('Upload',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('目錄已創建');
})
}
else
console.log(stats.isDirectory());
})//判斷是否有某目錄,若沒有則創建
2 讀取某個目錄下的所有文件夾,並將其打印出來
你可能會這麼寫
//錯誤代碼,stat函數是異步函數,for循環出錯,此處應該用匿名自執行函數實現同步
const fs = require('fs');
var file=[];
fs.readdir('Upload',(err,data)=>{
if(err)
{
console.log(err);
return false;
}
else
{
for(var i=0;i<data.length;i++)
{
fs.stat(data[i],(error,stats)=>{
if(stats.isDirectory())
file.push(data[i]);
})
}
console.log(file);
}
})
乍一看感覺沒有問題,先判斷是否有目錄,然後for循環對目錄下的每個文件進行判斷,判斷是否是目錄,是的話就push到數組裏,最後再打印數組。
但是這裏犯了一個錯誤,那就是stat()函數是一個異步函數,不能直接用for循環,假定這個目錄下面有三個文件兩個目錄,那麼data.length就是5,而for循環中執行了五次stat,但每次stat的i都等於5,也就是執行的函數是fs.stat(data[5]),自然這裏就會報錯。
這個問題的解決辦法就是使用匿名自執行函數來模擬同步
const fs = require('fs')
var file=[];
fs.readdir('Upload',(err,data)=>{
if(err)
{
console.log(err);
return false;
}
else
{
(function getFile(i){
if(i==data.length)
{
console.log(file);
return true;
}
fs.stat('Upload/'+data[i],(err,stats)=>{
if(stats.isDirectory())
file.push(data[i]);
getFile(i+1);
})
})(0)
}
})