05_Node js 檔案管理模組 fs

Web前端開發小K發表於2019-02-17

一、fs 基礎方法:

  • fs.stat 檢測是檔案還是目錄。
  • fs.mkdir 建立目錄。
  • fs.writeFile 建立寫入檔案。
  • fs.appendFile 追加檔案。
  • fs.readFile 讀取檔案(非同步)。
  • fs.readFileSync 讀取檔案(同步)。
  • fs.readdir 讀取目錄。
  • fs.rename 重新命名。
  • fs.rmdir 刪除目錄。
  • fs.unlink 刪除檔案。

1、fs.stat:檢測是檔案還是目錄

fs.js

const fs = require("fs");
fs.stat('fs.js', (error, stats) => {
    if (error) {
        console.log(error);
        return false;
    } else {
        console.log(stats);
        console.log(`檔案:${stats.isFile()}`); // 檔案:true
        console.log(`目錄:${stats.isDirectory()}`); // 目錄:false

        return false;
    };
});
複製程式碼

執行 node fs.js。

console.log(stats):
{ dev: 636204,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: undefined,
  ino: 1407374883609714,
  size: 242,
  blocks: undefined,
  atime: 2018-12-25T09:14:40.866Z,
  mtime: 2019-01-15T09:18:06.561Z,
  ctime: 2019-01-15T09:18:06.561Z,
  birthtime: 2018-12-25T09:14:40.866Z }

console.log(`檔案:${stats.isFile()}`); // 檔案:true
console.log(`目錄:${stats.isDirectory()}`); // 目錄:false
複製程式碼

補充:

  • stats.isFile() 如果是檔案返回 true,否則返回 false。
  • stats.isDirectory() 如果是目錄返回 true,否則返回 false。
  • stats.isBlockDevice() 如果是塊裝置返回 true,否則返回 false。
  • stats.isCharacterDevice() 如果是字元裝置返回 true,否則返回 false。
  • stats.isSymbolicLink() 如果是軟連結返回 true,否則返回 false。
  • stats.isFIFO() 如果是FIFO,返回true,否則返回 false,FIFO是UNIX中的一種特殊型別的命令管道。
  • stats.isSocket() 如果是 Socket 返回 true,否則返回 false。

2、fs.mkdir:建立目錄

fs.js

const fs = require("fs");
fs.mkdir('images', (err) => {
    if (err) {
        console.log(err);
        return false;
    } else {
        console.log("目錄建立成功!");
    };
});
複製程式碼

接收引數:

  • path:將建立的目錄路徑。
  • mode:目錄許可權(讀寫許可權),預設 0777。
  • callback:回撥,傳遞異常引數 err。

執行 node fs.js。

會發現目錄下多了一個 images 資料夾。

3、fs.rmdir:刪除目錄

fs.js

const fs = require("fs");
fs.rmdir('images', (err) => {
    if (err) {
        console.log(err);
        return false;
    } else {
        console.log("目錄刪除成功!");
    };
});
複製程式碼

執行 node fs.js。

會發現目錄下 images 資料夾被刪除。

4、fs.writeFile:建立寫入檔案

fs.js

const fs = require("fs");
fs.writeFile("index.js", "hello NodeJS!", (err) => {
    if (err) {
        console.log(err);
        return false;
    } else {
        console.log("檔案寫入成功!");
    };
});
複製程式碼

接收引數:

  • filename (String) 檔名稱。
  • data (String | Buffer) 將要寫入的內容,可以是字串或者 buffer 資料。
  • encoding (String) 可選。預設 'utf-8',當 data 是 buffer 時,該值應該為 ignored。
  • mode (Number) 檔案讀寫許可權,預設 438。
  • flag (String) 預設值 'w'。
  • callback { Function } 回撥,傳遞一個異常引數 err。

執行 node fs.js。

會發現目錄下多了一個 index.js 資料夾,並且新增了“hello NodeJS!”的內容。

注意,這樣的寫入,是清空原檔案中的所有資料,然後新增“hello NodeJS!”這句話,即:存在即覆蓋,不存在即建立。

5、fs.unlink:刪除檔案

fs.js

const fs = require("fs");
fs.unlink("index.js", (err) => {
    if (err) {
        console.log(err);
        return false;
    } else {
        console.log("刪除成功!");
    };
});
複製程式碼

執行 node fs.js。

會發現目錄下 index.js 檔案被刪除。

6、fs.appendFile:追加檔案

fs.js

const fs = require("fs");
fs.appendFile("index.js", "追加的內容", (err) => {
    if (err) {
        console.log(err);
        return false;
    } else {
        console.log("追加成功!");
    };
});
複製程式碼

執行 node fs.js。

會發現目錄下 index.js 檔案後有追加了一段話“追加的內容”。

7、fs.readFile:讀取檔案

fs.js

const fs = require("fs");
fs.readFile("index.js", (err, data) => {
    if (err) {
        console.log(err);
        return false;
    } else {
        console.log("讀取檔案成功!");
        console.log(data); // <Buffer 68 65 6c 6c 6f 20 4e 6f 64 65 4a 53 ef bc 81 e8 bf bd e5 8a a0 e7 9a 84 e5 86 85 e5 ae b9>
    };
});
複製程式碼

執行 node fs.js。

console.log(data) 列印結果:

<Buffer 68 65 6c 6c 6f 20 4e 6f 64 65 4a 53 ef bc 81 e8 bf bd e5 8a a0 e7 9a 84 e5 86 85 e5 ae b9>
複製程式碼

8、fs.readdir:讀取目錄

fs.js

const fs = require("fs");
fs.readdir("node_modules", (err, data) => {
    if (err) {
        console.log(err);
        return false;
    } else {
        console.log("讀取目錄成功!");
        console.log(data); // [ '03_tool_multiply.js', 'my_module' ]
    };
});
複製程式碼

執行 node fs.js。

console.log(data) 列印結果:

[ '03_tool_multiply.js', 'my_module' ]
複製程式碼

9、fs.rename:重新命名

fs.js

const fs = require("fs");
fs.rename("index.js", "new_index.js", (err) => {
    if (err) {
        console.log(err);
        return false;
    } else {
        console.log("重新命名成功!");
    };
});
複製程式碼

執行 node fs.js。

會發現目錄下 index.js 檔案被修改為 new_index.js。

10、補充:fs.rename 還可以剪下

fs.js

const fs = require("fs");
fs.rename("new_index.js", "node_modules/new_index.js", (err) => {
    if (err) {
        console.log(err);
        return false;
    } else {
        console.log("剪下成功!");
    };
});
複製程式碼

執行 node fs.js。

會發現目錄下 new_index.js 檔案被移動到了 node_modules 目錄下。

二、fs 案例

1、判斷是否有 upload 目錄

fsDemo.js

const fs = require("fs");
fs.stat("upload", (err, stats) => {
    if (err) {
        // 如果沒有,建立 upload 目錄
        fs.mkdir("upload", (err) => {
            if (err) {
                console.log(err);
                return false;
            } else {
                console.log("建立成功!");
            };
        })
    } else {
        console.log(stats.isDirectory()); // true
        console.log("有 upload 目錄,你可以做更多操作!");
    };
});
複製程式碼

執行 fsDemo.js。

列印結果:

console.log(stats.isDirectory()); // true
有 upload 目錄,你可以做更多操作!
複製程式碼

2、讀取目錄全部檔案

fsDemo.js

const fs = require("fs");
fs.readdir("../05fs/", (err, files) => {
    if (err) {
        console.log(err);
        return false;
    } else {
        console.log(files);
        let filesArr = [];

        (function getFile(i) {
            // 迴圈結束
            if (i == files.length) {
                // 列印出所有目錄
                console.log("目錄");
                console.log(filesArr);
                return false;
            };

            // 判斷目錄是檔案還是資料夾
            fs.stat("../05fs/" + files[i], (err, stats) => {
                if (stats.isDirectory()) {
                    filesArr.push(files[i]);
                };
                // 遞迴呼叫
                getFile(i + 1);
            });
        })(0);
    };
});
複製程式碼

執行 fsDemo.js。

列印結果:

[ 'fs.js', 'fsDemo.js', 'fsStream.js', 'upload' ]
目錄
[ 'upload' ]
複製程式碼

三、fs 流

1、fs 流及其讀取

首先建立一個 index.js 檔案,並新增測試文字。

fsStream.js

const fs = require("fs");
// 流的方式讀取檔案
const fileReadStream = fs.createReadStream("index.js");
// 讀取次數
let count = 0;
// 儲存資料
let str = "";
// 開始讀取
fileReadStream.on("data", (chunk) => {
    console.log(`${++count} 接收到:${chunk.length}`);
    str += chunk;
});
// 讀取完成
fileReadStream.on("end", () => {
    console.log("結束");
    console.log(count);
    console.log(str);
});
// 讀取失敗
fileReadStream.on("err", (err) => {
    console.log(err);
});
複製程式碼

執行 fsStream.js。

列印結果:

1 接收到:18
結束
1
fs 流及其讀取
複製程式碼

2、流的寫入

fsStream.js

const fs = require("fs");
let data = "存入資料...";
// 建立一個可以寫入的流,寫入到 index.js
let fileWriteStream = fs.createWriteStream("index.js");
// 開始寫入
fileWriteStream.write(data, "utf8");
// 寫入完成
fileWriteStream.end();
fileWriteStream.on("finish", () => {
    console.log("寫入完成!");
});
複製程式碼

執行 fsStream.js。

開啟 index.js 檔案,發現裡面內容變成了“存入資料...”。

列印結果:

寫入完成!
複製程式碼

以上我們就通過流的形式進行了讀取和寫入的操作。


05_Node js 檔案管理模組 fs

期待您的關注!

相關文章