最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在Nodejs中使用模塊fs文件系統(tǒng)

 更新時間:2021年05月04日 09:18:39   作者:淺笑·  
這篇文章主要介紹了如何在Nodejs中使用模塊fs文件系統(tǒng),對nodejs感興趣的同學(xué),可以參考下

概述

node 的fs文檔密密麻麻的 api 非常多,畢竟全面支持對文件系統(tǒng)的操作。文檔組織的很好,操作基本分為文件操作、目錄操作、文件信息、流這個大方面,編程方式也支持同步、異步和 Promise。

本文記錄了幾個文檔中沒詳細(xì)描寫的問題,可以更好地串聯(lián)fs文檔思路:

  • 文件描述符
  • 同步、異步與 Promise
  • 目錄與目錄項
  • 文件信息
  • stream

文件描述符

文件描述符是一個非負(fù)整數(shù)。它是一個索引值,操作系統(tǒng)可以根據(jù)它來找到對應(yīng)的文件。

在 fs 的很多底層 api 中,需要用到文件描述符。在文檔中,描述符通常用fd來代表。例如:fs.read(fd, buffer, offset, length, position, callback)。與這個 api 相對應(yīng)的是:fs.readFile(path[, options], callback)。

因為操作系統(tǒng)對文件描述符的數(shù)量有限制,因此在結(jié)束文件操作后,別忘記 close:

const fs = require("fs");

fs.open("./db.json", "r", (err, fd) => {
    if (err) throw err;
    // 文件操作...
    // 完成操作后,關(guān)閉文件
    fs.close(fd, err => {
        if (err) throw err;
    });
});

同步、異步與 Promise

所有文件系統(tǒng)的 api 都有同步和異步兩種形式。

同步寫法

不推薦使用同步 api,會阻塞線程。

try {
    const buf = fs.readFileSync("./package.json");
    console.log(buf.toString("utf8"));
} catch (error) {
    console.log(error.message);
}

異步寫法

異步寫法寫起來容易進(jìn)入回調(diào)地獄。

fs.readFile("./package.json", (err, data) => {
    if (err) throw err;
    console.log(data.toString("utf8"));
});

(推薦)Promise 寫法

在 node v12 之前,需要自己借助 promise 封裝:

function readFilePromise(path, encoding = "utf8") {
    const promise = new Promise((resolve, reject) => {
        fs.readFile(path, (err, data) => {
            if (err) return reject(err);
            return resolve(data.toString(encoding));
        });
    });
    return promise;
}

readFilePromise("./package.json").then(res => console.log(res));

在 node v12 中,引入了 fs Promise api。它們返回 Promise 對象而不是使用回調(diào)。 API 可通過require('fs').promises訪問。如此一來,開發(fā)成本更低了。

const fsPromises = require("fs").promises;

fsPromises
    .readFile("./package.json", {
        encoding: "utf8",
        flag: "r"
    })
    .then(console.log)
    .catch(console.error);

目錄與目錄項

fs.Dir 類:封裝了和文件目錄相關(guān)的操作

fs.Dirent 類:封裝了目錄項的相關(guān)操作。例如判斷設(shè)備類型(字符、塊、FIFO 等)。

它們之間的關(guān)系,通過代碼展示:

const fsPromises = require("fs").promises;

async function main() {
    const dir = await fsPromises.opendir(".");
    let dirent = null;
    while ((dirent = await dir.read()) !== null) {
        console.log(dirent.name);
    }
}

main();

文件信息

fs.Stats 類:封裝了文件信息相關(guān)的操作。它在fs.stat()的回調(diào)函數(shù)中返回。

fs.stat("./package.json", (err, stats) => {
    if (err) throw err;
    console.log(stats);
});

注意,關(guān)于檢查文件是否存在:

  • 不建議在調(diào)用 fs.open()、 fs.readFile() 或 fs.writeFile() 之前使用 fs.stat() 檢查文件是否存在。而是應(yīng)該直接打開、讀取或?qū)懭胛募绻募豢捎脛t處理引發(fā)的錯誤。
  • 要檢查文件是否存在但隨后并不對其進(jìn)行操作,則建議使用 fs.access()

ReadStream 與 WriteStream

在 nodejs 中,stream 是個非常重要的庫。很多庫的 api 都是基于 stream 來封裝的。例如下面要說的 fs 中的 ReadStream 和 WriteStream。

fs 本身提供了 readFile 和 writeFile,它們好用的代價就是性能有問題,會將內(nèi)容一次全部載入內(nèi)存。但是對于幾 GB 的大文件,顯然會有問題。

那么針對大文件的解決方案自然是:一點點讀出來。這就需要用到 stream 了。以 readStream 為例,代碼如下:

const rs = fs.createReadStream("./package.json");
let content = "";

rs.on("open", () => {
    console.log("start to read");
});

rs.on("data", chunk => {
    content += chunk.toString("utf8");
});

rs.on("close", () => {
    console.log("finish read, content is:\n", content);
});

借助 stream 的 pipe,一行快速封裝一個大文件的拷貝函數(shù):

function copyBigFile(src, target) {
    fs.createReadStream(src).pipe(fs.createWriteStream(target));
}

以上就是如何在Nodejs中使用模塊fs文件系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于Nodejs的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • node.js自動上傳ftp的腳本分享

    node.js自動上傳ftp的腳本分享

    這篇文章主要給大家介紹了一個關(guān)于node.js自動上傳ftp腳本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • 防止Node.js中錯誤導(dǎo)致進(jìn)程阻塞的辦法

    防止Node.js中錯誤導(dǎo)致進(jìn)程阻塞的辦法

    Node.js我們用到非常的多了,如果我們開發(fā)不當(dāng)可能因錯誤導(dǎo)致進(jìn)程阻塞問題,對于進(jìn)程阻塞問題一直是個頭痛的事情,今天我們一起來看一篇關(guān)于Node.js防止錯誤導(dǎo)致的進(jìn)程阻塞示例,下面一起來看看。
    2016-08-08
  • Node.js 中正確使用 async/await 與 Promise 對象配合(操作方法)

    Node.js 中正確使用 async/await 與 Promise 

    在Node.js中,async/await是ES2017引入的一種更簡潔的處理異步操作的方式,它基于Promise來進(jìn)行編寫,使得異步代碼看起來更像同步代碼,易于理解和維護(hù),這篇文章主要介紹了Node.js 中正確使用 async/await 與 Promise 對象配合,需要的朋友可以參考下
    2024-07-07
  • NodeJS通過魔術(shù)封包喚醒局域網(wǎng)計算機實例

    NodeJS通過魔術(shù)封包喚醒局域網(wǎng)計算機實例

    這篇文章主要為大家介紹了NodeJS通過魔術(shù)封包喚醒局域網(wǎng)計算機代碼實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 詳解Express筆記之動態(tài)渲染HTML(新手入坑)

    詳解Express筆記之動態(tài)渲染HTML(新手入坑)

    這篇文章主要介紹了詳解Express筆記之動態(tài)渲染HTML(新手入坑),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • npm安裝慢的問題分析及解決方法

    npm安裝慢的問題分析及解決方法

    在Node.js開發(fā)過程中,npm install 是安裝和管理項目依賴的關(guān)鍵命令,然而,有時我們會遇到 npm install 運行卡住不動的情況,所以本文給大家介紹了npm安裝慢的問題分析及解決方法,需要的朋友可以參考下
    2025-03-03
  • node中間層實現(xiàn)文件上傳功能

    node中間層實現(xiàn)文件上傳功能

    這篇文章主要介紹了node中間層實現(xiàn)文件上傳功能,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-06-06
  • node.js調(diào)用C++函數(shù)的方法示例

    node.js調(diào)用C++函數(shù)的方法示例

    這篇文章主要介紹了node.js調(diào)用C++函數(shù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • 如何利用nodejs實現(xiàn)命令行游戲

    如何利用nodejs實現(xiàn)命令行游戲

    這篇文章主要給大家介紹了關(guān)于如何利用nodejs實現(xiàn)命令行游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Nodejs提取網(wǎng)址參數(shù)解決“querystring”已棄用問題

    Nodejs提取網(wǎng)址參數(shù)解決“querystring”已棄用問題

    無論是前端還是后端,經(jīng)常出現(xiàn)的應(yīng)用場景是URL中參數(shù)的處理,下面這篇文章主要給大家介紹了關(guān)于Nodejs提取網(wǎng)址參數(shù)解決“querystring”已棄用問題的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評論

板桥市| 杭州市| 岳阳市| 伽师县| 介休市| 衡阳市| 衡阳市| 郯城县| 岑巩县| 西平县| 嵩明县| 新郑市| 舞钢市| 高邮市| 介休市| 枞阳县| 博客| 遵义县| 莱芜市| 马关县| 共和县| 通榆县| 大田县| 堆龙德庆县| 清水河县| 柯坪县| 福泉市| 蒲城县| 嵩明县| 始兴县| 海林市| 彭州市| 漳浦县| 五台县| 闻喜县| 柏乡县| 通道| 高陵县| 十堰市| 开封市| 左云县|