Nodejs FS模塊學習總結

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)
    }
})

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章