node.js之文件操作

與其他模塊相同,首先引入fs文件操作模塊,使用require引入。
node.js的文件操作與php類(lèi)似,都是一些讀,寫(xiě),復(fù)制,刪除等一些基本操作,但他比php要簡(jiǎn)單點(diǎn),就三個(gè)參數(shù)a:追加;w:寫(xiě)入;r:讀取,php除了有這第三種之外還有a+,w+等操作,較為復(fù)雜點(diǎn)。
文件操作分為兩大塊:文件的操作與文件夾的操作

一、文件的操作

1. 創(chuàng)建文件

flag對(duì)應(yīng)的有三個(gè)參數(shù):a追加 w寫(xiě)入 r讀取
注意區(qū)分a與w的區(qū)別:

  • a:是追加,在文件中添加新的東西不覆蓋文件原有的東西;
  • w:寫(xiě)入,添加新的內(nèi)容覆蓋文件中原有的內(nèi)容;
    兩種方式創(chuàng)建文件
fs.writeFile("2.txt","我是2.txt文件",{flag:"a"},function (err) {
    if(err){
        console.log(err);
    }else {
        console.log("寫(xiě)入成功");
    }
})
fs.appendFile("2.txt","我是追加的字符",function(err){
    if(err) {
        return console.log(err);
    }else{
        console.log("追加成功");
    }
})

上面是異步創(chuàng)建,每個(gè)文件操作的函數(shù)都有異步和同步兩種,所有同步的函數(shù)都是異步函數(shù)后面加Sync,這里以writeFileSync為例,說(shuō)一下同步的函數(shù)寫(xiě)法,其他函數(shù)寫(xiě)法類(lèi)似,就不一一細(xì)說(shuō)了。
同步函數(shù)寫(xiě)法比異步簡(jiǎn)單,寫(xiě)入成功無(wú)返回值,不需要回調(diào)函數(shù):

var res = fs.writeFileSync("1.txt","我是寫(xiě)入的內(nèi)容333");

2. 文件的讀取

使用readFile,第一個(gè)參數(shù):文件名,第二個(gè)為回調(diào)函數(shù),回調(diào)函數(shù)返回兩個(gè)參數(shù)err,data
err:返回錯(cuò)誤信息;data:返回文件內(nèi)容

fs.readFile("1.txt",function(err,data){
    if(err){
        console.log(err);
    }else{
        console.log(data.toString());
    }
})

3. 文件的修改

這里的文件修改不是對(duì)文件的內(nèi)容經(jīng)行修改,只是對(duì)文件名的修改,下面代碼就是將『1.txt』的文件名修改成『2.txt』。

fs.rename("1.txt","5.txt",function(err){
    if(err){
        return console.log(err);
    }else{
        console.log("修改成功");
    }
});

4. 文件刪除

與php類(lèi)似,使用unlink刪除

fs.unlink("2.txt",function(err){
    if(err){
        return console.log(err);
    }else{
        console.log("刪除成功");
    }
});

5. 復(fù)制

node.js的文件操作沒(méi)有特定的函數(shù),不過(guò)我們可以自己寫(xiě)一個(gè)函數(shù)來(lái)復(fù)制文件

  1. 異步函數(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ù)制成功");
                }
            })
        }
    })
}
  1. 使用同步函數(shù)更加簡(jiǎn)單,就一行代碼
function mycopy(src,dest){
    fs.writeFileSync(dest,fs.readFileSync(src));
}

二、文件夾的操作

對(duì)于文件夾的操作,要了解mode的三個(gè)數(shù)字的含義:mode 的三個(gè)數(shù)字,分別表示owner(所有者),group(組用戶),others(其他用戶)所具有的權(quán)限。

  • 1 = x 執(zhí)行;
  • 2 = w 寫(xiě);
  • 4 = r 讀;
    比如owner具有所有權(quán)限,1+2+4=7, 又比如group 具有讀 和執(zhí)行權(quán)限 1+4 = 5

1. 目錄創(chuàng)建

777代表?yè)碛兴袡?quán)限,前面的0是代表八進(jìn)制,無(wú)其他意義。
下面代碼的意思是創(chuàng)建了一個(gè)名為"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. 判斷文件或者文件夾是否存在

往往在新建文件夾之前得判斷文件夾是否存在,若不存在才新建,此時(shí)使用exists來(lái)判斷

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ì)信息,針對(duì)詳細(xì)信息來(lái)判斷是否是文件夾

詳細(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,但是這個(gè)函數(shù)沒(méi)有多大用,因?yàn)樗荒軇h除空的文件夾,往往在應(yīng)用中,我們都是需要?jiǎng)h除不是空的文件夾。所以刪除文件夾的函數(shù)得自己寫(xiě)。系統(tǒng)沒(méi)提供這個(gè)函數(shù),但肯定難不倒我們這些程序員啊,畢竟這些封裝好的底層函數(shù)也是那些大牛程序員寫(xiě)出來(lái)的啊。
這個(gè)刪除函數(shù)只能刪除空的文件夾:

fs.rmdir("22",function(err){
    if(err){
        return console.log(err);
    }else{
        console.log("刪除成功");
    }
})

接下來(lái)可以自己封裝一個(gè)刪除文件夾的函數(shù),能刪除文件夾里的所有文件

function removeDir(src) {
    //  獲取文件夾里的內(nèi)容
    var arr = fs.readdirSync(src);
    console.log(arr);
    //  判斷是否是文件,如果是文件刪除;如果是文件夾在執(zhí)行相同的過(guò)程
    for(var i = 0 ; i< arr.length ;i++){
    //    子文件的詳細(xì)信息
    //    組裝文件或者文件夾的路徑
        var url = src+"/"+arr[i];
        var data = fs.statSync(url);
        // 判斷每個(gè)元素是文件或者是文件夾
        if(data.isFile()){
            fs.unlinkSync(url);
        }else{
            removeDir(url);
        }
    }
    // 刪除空文件夾
    fs.rmdirSync(src);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這真的是一篇跨年的文章了,好長(zhǎng),一邊看,一邊跟著敲代碼驗(yàn)證,那么,問(wèn)題來(lái)了,你和誰(shuí)一起跨年了(機(jī)智臉)? 在Nod...
    范小飯_閱讀 1,448評(píng)論 3 8
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • 文件系統(tǒng)模塊是一個(gè)封裝了標(biāo)準(zhǔn)的 POSIX 文件 I/O 操作的集合。通過(guò)require('fs')使用這個(gè)模塊。...
    保川閱讀 940評(píng)論 0 0
  • 第一版 之前公司做了一個(gè)類(lèi)似于知乎小圓桌的頁(yè)面,但是寫(xiě)完一直感覺(jué)有些地方不夠好,所以就拿Swift重新寫(xiě)了一遍,如...
    軒轅小羽閱讀 4,792評(píng)論 11 55
  • 報(bào)了課嘗試一下鋼筆畫(huà),線稿部分把握的還行。 可能是顏料不是很好,我用的馬利24色固彩,總感覺(jué)顏色太淡,不透,畫(huà)出來(lái)...
    多蘿格格閱讀 576評(píng)論 4 13

友情鏈接更多精彩內(nèi)容