與其他模塊相同吗伤,首先引入fs文件操作模塊吃靠,使用require引入。
node.js的文件操作與php類似足淆,都是一些讀巢块,寫,復(fù)制巧号,刪除等一些基本操作族奢,但他比php要簡單點,就三個參數(shù)a:追加丹鸿;w:寫入越走;r:讀取,php除了有這第三種之外還有a+,w+等操作靠欢,較為復(fù)雜點廊敌。
文件操作分為兩大塊:文件的操作與文件夾的操作
一、文件的操作
1. 創(chuàng)建文件
flag對應(yīng)的有三個參數(shù):a追加 w寫入 r讀取
注意區(qū)分a與w的區(qū)別:
- a:是追加门怪,在文件中添加新的東西不覆蓋文件原有的東西;
- w:寫入骡澈,添加新的內(nèi)容覆蓋文件中原有的內(nèi)容;
兩種方式創(chuàng)建文件
fs.writeFile("2.txt","我是2.txt文件",{flag:"a"},function (err) {
if(err){
console.log(err);
}else {
console.log("寫入成功");
}
})
fs.appendFile("2.txt","我是追加的字符",function(err){
if(err) {
return console.log(err);
}else{
console.log("追加成功");
}
})
上面是異步創(chuàng)建掷空,每個文件操作的函數(shù)都有異步和同步兩種肋殴,所有同步的函數(shù)都是異步函數(shù)后面加Sync,這里以writeFileSync為例拣帽,說一下同步的函數(shù)寫法疼电,其他函數(shù)寫法類似,就不一一細(xì)說了减拭。
同步函數(shù)寫法比異步簡單蔽豺,寫入成功無返回值,不需要回調(diào)函數(shù):
var res = fs.writeFileSync("1.txt","我是寫入的內(nèi)容333");
2. 文件的讀取
使用readFile拧粪,第一個參數(shù):文件名修陡,第二個為回調(diào)函數(shù),回調(diào)函數(shù)返回兩個參數(shù)err,data
err:返回錯誤信息可霎;data:返回文件內(nèi)容
fs.readFile("1.txt",function(err,data){
if(err){
console.log(err);
}else{
console.log(data.toString());
}
})
3. 文件的修改
這里的文件修改不是對文件的內(nèi)容經(jīng)行修改魄鸦,只是對文件名的修改,下面代碼就是將『1.txt』的文件名修改成『2.txt』癣朗。
fs.rename("1.txt","5.txt",function(err){
if(err){
return console.log(err);
}else{
console.log("修改成功");
}
});
4. 文件刪除
與php類似拾因,使用unlink刪除
fs.unlink("2.txt",function(err){
if(err){
return console.log(err);
}else{
console.log("刪除成功");
}
});
5. 復(fù)制
node.js的文件操作沒有特定的函數(shù),不過我們可以自己寫一個函數(shù)來復(fù)制文件
- 異步函數(shù)封裝的復(fù)制函數(shù)
function mycopy(path1,path2) {
fs.readFile(path1,function(err,data){
if(err){
console.log(err);
}else{
var data1 = data.toString();
fs.writeFile(path2,data1,function(err){
if(err){
console.log(err);
}else{
console.log("復(fù)制成功");
}
})
}
})
}
- 使用同步函數(shù)更加簡單,就一行代碼
function mycopy(src,dest){
fs.writeFileSync(dest,fs.readFileSync(src));
}
二绢记、文件夾的操作
對于文件夾的操作扁达,要了解mode的三個數(shù)字的含義:mode 的三個數(shù)字,分別表示owner(所有者)蠢熄,group(組用戶),others(其他用戶)所具有的權(quán)限跪解。
- 1 = x 執(zhí)行;
- 2 = w 寫签孔;
- 4 = r 讀叉讥;
比如owner具有所有權(quán)限,1+2+4=7, 又比如group 具有讀 和執(zhí)行權(quán)限 1+4 = 5
1. 目錄創(chuàng)建
777代表擁有所有權(quán)限饥追,前面的0是代表八進制图仓,無其他意義。
下面代碼的意思是創(chuàng)建了一個名為"33"的文件夾
fs.mkdir("33",0777,function (err) {
if(err){
return console.log(err);
}else{
console.log("創(chuàng)建成功");
}
})
2. 修改文件夾權(quán)限
fs.chmod("22",0777,function (err) {
if(err){
console.log(err);
}else{
console.log("修改權(quán)限成功");
}
})
3. 重命名文件夾
把"11"文件夾重命名為"22"
fs.rename("11","33",function(err){
if(err){
return console.log(err);
}else{
console.log("修改成功");
}
})
4. 讀取文件夾
回調(diào)函數(shù)返回的data是數(shù)組判耕,存的是文件夾里的文件或者文件夾名稱
fs.readdir("22",function(err,data){
if(err){
return console.log(err);
}else{
console.log(data);
}
})
5. 判斷文件或者文件夾是否存在
往往在新建文件夾之前得判斷文件夾是否存在透绩,若不存在才新建,此時使用exists來判斷
fs.exists("22",function(exists){
if(exists){
console.log("文件夾已經(jīng)存在");
}else{
// noinspection JSAnnotator
fs.mkdir("22",0777,function(err){
if(err){
return console.log(err);
}else{
console.log("創(chuàng)建成功");
}
})
}
})
6. 顯示文件的詳細(xì)信息壁熄,針對詳細(xì)信息來判斷是否是文件夾
詳細(xì)信息的函數(shù)是stat,返回的參數(shù)data;
data.ifFile() 判斷是否是文件
data.isDirectory() 判斷是否是文件夾
fs.stat("22",function(err,data){
if(err){
return console.log(err);
}else{
console.log(data);
// 判斷是否是文件
// 判斷是否是文件夾
// data.isDirectory();
var res = data.isFile();
if(res){
console.log("是文件");
}else {
console.log("是文件夾");
}
}
});
7. 文件夾的刪除
系統(tǒng)自帶的刪除函數(shù)是rmdir,但是這個函數(shù)沒有多大用,因為他只能刪除空的文件夾碳竟,往往在應(yīng)用中草丧,我們都是需要刪除不是空的文件夾。所以刪除文件夾的函數(shù)得自己寫莹桅。系統(tǒng)沒提供這個函數(shù)昌执,但肯定難不倒我們這些程序員啊,畢竟這些封裝好的底層函數(shù)也是那些大牛程序員寫出來的啊诈泼。
這個刪除函數(shù)只能刪除空的文件夾:
fs.rmdir("22",function(err){
if(err){
return console.log(err);
}else{
console.log("刪除成功");
}
})
接下來可以自己封裝一個刪除文件夾的函數(shù)懂拾,能刪除文件夾里的所有文件
function removeDir(src) {
// 獲取文件夾里的內(nèi)容
var arr = fs.readdirSync(src);
console.log(arr);
// 判斷是否是文件,如果是文件刪除铐达;如果是文件夾在執(zhí)行相同的過程
for(var i = 0 ; i< arr.length ;i++){
// 子文件的詳細(xì)信息
// 組裝文件或者文件夾的路徑
var url = src+"/"+arr[i];
var data = fs.statSync(url);
// 判斷每個元素是文件或者是文件夾
if(data.isFile()){
fs.unlinkSync(url);
}else{
removeDir(url);
}
}
// 刪除空文件夾
fs.rmdirSync(src);
}