nodejs之-fs模組

webxiaoma發表於2019-02-16
該文章以收錄 《nodeJS探索之路》

本文所有練習已放入:https://github.com/webxiaoma/nodeJS-demos 的 file 資料夾中


前言

fs模組在nodeJS算是比較重要的模組了,本文主要講的是nodejs 中fs模組的基礎知識,目的是瞭解fs模組的大體作用。使用前先要引入fs模組,本文約定以const fs=require(`fs`)引入。詳細的API請訪問官網fs模組

同步和非同步

fs模組中的方法一般的都有同步和非同步的方法,例如讀取檔案

非同步方法:

fs.readFile(`./test.txt`,(err,data)=>{
    if(err) throw err;
    console.log(data)
})

同步方法

let SyncFile = fs.readFileSync( `./test.txt`,`utf-8`);
cosnole.log(SyncFile);

一般同步方法是在非同步方法名後面加上了Sync 一詞。

檔案處理

1.讀取檔案內容

fs.readFile(path[, options], callback)

引數:

  • path <string> | <Buffer> | <URL> | <integer> 檔名或檔案描述符。

  • options <Object> | <string>

  1. encoding <string> | <null> 預設為 null。

  2. flag <string> 預設為 `r`。

  • callback <Function>

  1. err <Error>

  2. data <string> | <Buffer>

fs.readFile(`./test.txt`,function(err,data){
    if(err){
        throw err;
    }
    console.log(data) 
    console.log(data.toString())
})

2.寫入檔案內容

fs.writeFile(file, data[, options], callback)非同步地寫入資料到檔案,如果檔案已經存在,則替代檔案。

  • file <string> | <Buffer> | <integer> 檔名或檔案描述符

  • data <string> | <Buffer> | <Uint8Array>

  • options <Object> | <string>

  1. encoding <string> | <null> 預設 = `utf8`

  2. mode <integer> 預設 = 0o666

  3. flag <string> 預設 = `w`

  • callback <Function>

fs.writeFile(`./write.txt`,`test`,err =>{
    if(err) throw err;
    console.log("寫入成功");

    fs.readFile(`./write.txt`,`utf-8`,(err,data) =>{
        if(err) throw err;

        console.log(`讀取成功:`+ data);
    })
})

3.刪除檔案內容

fs.unlink(path, callback)

  • path <string> | <Buffer> | <URL>

  • callback <Function>

  1. err <Error>

fs.unlink(`./delete.txt`,err=>{
   assert.ifError(err);
   console.log(`以刪除檔案:delete.txt`)
})

4.追加檔案內容

fs.appendFile(file, data[, options], callback)如果追加內容的檔案不存在則,建立該檔案

  • file <string> | <Buffer> | <number> 檔名或檔案描述符

  • data <string> | <Buffer>

  • options <Object> | <string>

  1. encoding <string> | <null> 預設為 `utf8`

  2. mode <integer> 預設為 0o666

  3. flag <string> 預設為 `a`

  • callback <Function>

  1. err <Error>

fs.appendFile(`./add.txt`,`追加的內容`,`utf8`,(err)=>{
   assert.ifError(err);
   console.log(fs.readFileSync(`./add.txt`,`utf8`)) 
})

5.擷取檔案內容

在說擷取檔案內容之前,我們還要說一種開啟檔案,讀取寫入檔案內容的方法

開啟檔案: fs.open
讀取檔案內容: fs.read
寫入檔案內容:fs.write
關閉檔案:fs.close

他們和readFilewriteFile的區別就是比較底層,fs.readfs.write需要依託fs.open, 開啟檔案得到檔案控制程式碼,然後基於檔案控制程式碼讀寫。實際上我們用的readFilewriteFile還是比較多。我們來看一個例子:

fs.open(`./open.txt`,`a+`,(err,fd)=>{
    if(err) throw err;
    console.log("檔案以開啟");

    let readBuffer = new Buffer.alloc(30);
    let writeBuffer = new Buffer.from(" add content")
    fs.write(fd,writeBuffer,0,writeBuffer.length,0,(err,bytesWritten,buffer)=>{
        if(err) throw err;

        console.log(`寫入成功,寫入的長度:${bytesWritten}, 寫入的內容:${buffer}`);
        //寫入成功,寫入的長度: 12, 寫入的內容:add content

          fs.read(fd,readBuffer,0,30,0,(err, bytesRead, buffer)=>{
            if(err) throw err;
            console.log(bytesRead) // 17
            console.log(buffer.toString());// last add content

            // 關閉
            fs.close(fd);

         })
         

    })

   
})

我們這裡說的擷取檔案內容的方法是基於fs.open方法的

fs.ftruncate(fd[, len], callback)

  • fd <integer>

  • len <integer> 預設 = 0

  • callback <Function>

  1. err <Error>

let fd = fs.openSync(`open.txt`,`r+`);

fs.ftruncate(fd,5,(err)=>{
    assert.ifError(err);
    console.log("擷取內容為:" +fs.readFileSync(`open.txt`,`utf-8`));
    //擷取內容為:last
     fs.close(fd);
});

目錄操作

1.建立目錄

如果檔案已經存在,會報錯

fs.mkdir(`./newdir`,function(err){
    
    if(err) throw err
    console.log("make dir success")
})

2.讀取目錄

fs.readdir(`./newdir`,(err,files)=>{
     if(err) throw err;
     // files 是一個陣列
     console.log(Array.isArray(files))
     console.log("讀目錄取成功:"+ files);
})

3.刪除目錄

刪除目錄時,如果目錄不是空的將會報錯

fs.rmdir(`./delete_dir`,function(err){
   if(err) throw err;
   console.log(`delete dir success`)

})

讀取檔案的常用模式

mode 用於建立檔案時給檔案制定許可權,預設0666

flag:

`r` -   以讀取模式開啟檔案。
`r+` - 以讀寫模式開啟檔案。
`rs` - 使用同步模式開啟並讀取檔案。指示作業系統忽略本地檔案系統快取。
`rs+` - 以同步的方式開啟,讀取 並 寫入檔案。
//注意:這不是讓fs.open變成同步模式的阻塞操作。如果想要同步模式請使用fs.openSync()。
 
`w` - 以讀取模式開啟檔案,如果檔案不存在則建立
`wx` - 和 ` w ` 模式一樣,如果檔案存在則返回失敗
`w+` - 以讀寫模式開啟檔案,如果檔案不存在則建立
`wx+` - 和 ` w+ ` 模式一樣,如果檔案存在則返回失敗
 
`a` - 以追加模式開啟檔案,如果檔案不存在則建立
`ax` - 和 ` a ` 模式一樣,如果檔案存在則返回失敗
`a+` - 以讀取追加模式開啟檔案,如果檔案不存在則建立
`ax+` - 和 ` a+ ` 模式一樣,如果檔案存在則返回失敗

結束

詳細API 請訪問node官網

相關文章