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

如何使用Node.js遍歷文件夾詳解

 更新時間:2022年03月01日 15:37:47   作者:吳鍇  
目錄遍歷挺常見,操作一個文件夾里的所有文件,替換或者添加刪除某些東西是非常普遍的操作,這篇文章主要給大家介紹了關(guān)于如何使用Node.js遍歷文件夾的相關(guān)資料,需要的朋友可以參考下

前言

最近在寫一個管理 markdown 文件的工具 knowledge-center,需要讀取指定文件夾內(nèi)所有 markdown 文件。因此需要用 Node.js 來實現(xiàn)遍歷一個文件夾內(nèi)所有文件的功能。

Node.js 中提供了這些有用的 API:

  • fs.readdir:異步讀取文件夾
  • fs.readdirSync:同步讀取文件夾
  • fs.statSync:同步獲取文件屬性

獲取的文件列表為數(shù)組格式

對于遍歷的結(jié)果,我們可以選擇按列表或文件樹來展示。先從最簡單的情況看起,用同步方式處理,返回結(jié)果是一個列表。

先使用 fs.readdirSync 獲取文件列表,然后遍歷文件列表,使用 fs.statSync 獲取列表中文件的狀態(tài),如果是文件,則添加到文件列表中,如果是文件夾,則遞歸調(diào)用 traverseFolderList 函數(shù),直到獲取到所有文件。

獲取的文件列表為對象格式

如果我們想展示文件夾目錄結(jié)構(gòu),那么列表格式的就不太方便了。假設(shè)有如下的文件夾結(jié)構(gòu):

./1
├── 2
│   ├── test2.txt
│   └── test2_1.txt
└── 3
    ├── 4
    │   └── test4.txt
    └── test3.txt

希望獲取到的對象結(jié)構(gòu)如下:

{
  root: {
    path: './1',
    type: 'folder',
    children: ['2', '3'],
    isRoot: true,
  },
  2: {
    path: '2',
    type: 'folder',
    children: ['2/test2.txt', '2/test2_1.txt'],
  },
  3: { path: '3', type: 'folder', children: ['3/4', '3/test3.txt'] },
  '2/test2.txt': { path: '2/test2.txt', type: 'file' },
  '2/test2_1.txt': { path: '2/test2_1.txt', type: 'file' },
  '3/4/test4.txt': { path: '3/4/test4.txt', type: 'folder', children: [] },
  '3/4': { path: '3/4', type: 'folder', children: ['3/4/test4.txt'] },
  '3/test3.txt': { path: '3/test3.txt', type: 'file' },
};

這個對象以文件/文件夾相對于根目錄的相對路徑為 key,每個節(jié)點包含了這些屬性:

  • type:用于區(qū)分文件或文件夾類型
  • path:相對路徑
  • children:如果是文件夾類型,則其中是子文件的相對路徑

異步方式

在上面的實現(xiàn)中,都是使用了同步的方式來處理,即 fs.readdirSync 方法,可以使用異步方式來處理嗎?

可以選擇 fs.readdir 來異步讀取文件夾, 但是回調(diào)函數(shù)的調(diào)用方式不太方便。在 Node 10+ 中提供了 fs.promises API,其中提供了一些文件系統(tǒng)的方法,它們返回的是一個 Promise 對象,而非使用回調(diào)函數(shù)。這里可以從 fs.promises 中引入 readdir 方法,從而可以使用方便的 async/await 語法來進行異步處理,避免了回調(diào)函數(shù)的方式。

const { readdir } = require('fs').promises; 

將上面的 traverseFolderList 方法重寫為異步格式:

比較同步和異步兩種方案

traverseFolderList 和 asyncTraverseFolderList 返回的結(jié)果都是列表格式,我們可以寫一個測試腳本來比較下二者的運行時間:

分別用兩個函數(shù)遍歷了同一個文件夾十次后,統(tǒng)計結(jié)果如下,異步方式比同步方式減少了約18%的時間。

同步 - 平均耗時:1217.1ms
異步 - 平均耗時:1025.7ms

注意一點,本文中的代碼都是沒有做錯誤處理的,實際上讀取文件時可能會出錯,因此將相應(yīng)的代碼使用 try...catch 包起來是一個合理的做法。

附node遍歷文件夾并讀取文件內(nèi)容

var fs = require('fs');
var path = require('path');//解析需要遍歷的文件夾
var filePath = path.resolve('./dist');
//調(diào)用文件遍歷方法
fileDisplay(filePath);
//文件遍歷方法
function fileDisplay(filePath){undefined
    //根據(jù)文件路徑讀取文件,返回文件列表
    fs.readdir(filePath,function(err,files){undefined
        if(err){undefined
            console.warn(err)
        }else{undefined
            //遍歷讀取到的文件列表
            files.forEach(function(filename){undefined
                //獲取當(dāng)前文件的絕對路徑
                var filedir = path.join(filePath, filename);
                //根據(jù)文件路徑獲取文件信息,返回一個fs.Stats對象
                fs.stat(filedir,function(eror, stats){undefined
                    if(eror){undefined
                        console.warn('獲取文件stats失敗');
                    }else{undefined
                        var isFile = stats.isFile();//是文件
                        var isDir = stats.isDirectory();//是文件夾
                        if(isFile){undefined
                            console.log(filedir);                 // 讀取文件內(nèi)容
                            var content = fs.readFileSync(filedir, 'utf-8');
                            console.log(content);
                        }
                        if(isDir){undefined
                            fileDisplay(filedir);//遞歸,如果是文件夾,就繼續(xù)遍歷該文件夾下面的文件
                        }
                    }
                })
            });
        }
    });
}

如果碰到有中文不能解析的html,這樣寫

var cheerio = require('cheerio');
var iconv = require('iconv-lite');
var myHtml = fs.readFileSync("index.html");
var myHtml2 = iconv.decode(myHtml, 'gbk');
console.log(myHtml2);

參考資料

https://stackoverflow.com/a/45130990

fs.promises API

https://javascript.info/promisify

總結(jié)

到此這篇關(guān)于如何使用Node.js遍歷文件夾的文章就介紹到這了,更多相關(guān)Node.js遍歷文件夾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • HTTP JSON接口模擬工具Interfake快速入門教程

    HTTP JSON接口模擬工具Interfake快速入門教程

    這篇文章主要為大家介紹了HTTP JSON接口模擬工具Interfake快速入門教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Node.js實現(xiàn)數(shù)據(jù)推送

    Node.js實現(xiàn)數(shù)據(jù)推送

    這篇文章主要為大家詳細介紹了Node.js實現(xiàn)數(shù)據(jù)推送的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 使用nodeJs來安裝less及編譯less文件為css文件的方法

    使用nodeJs來安裝less及編譯less文件為css文件的方法

    這篇文章主要介紹了使用nodeJs來安裝less及編譯less文件為css文件的方法,在文章末尾給大家補充介紹了通過nodejs將less文件轉(zhuǎn)為css文件的方法,具體內(nèi)容詳情大家通過本文學(xué)習(xí)吧
    2017-11-11
  • nodejs如何將高版本降為低版本

    nodejs如何將高版本降為低版本

    在遇到項目依賴低版本Node.js時,直接安裝低版本可能會遇到困難,本文提供了一種通過卸載當(dāng)前高版本Node.js并使用NVM(Node Version Manager)來管理和安裝低版本Node.js的方法,首先,需要卸載現(xiàn)有的Node.js環(huán)境并清理相關(guān)文件
    2024-10-10
  • 基于html5和nodejs相結(jié)合實現(xiàn)websocket即使通訊

    基于html5和nodejs相結(jié)合實現(xiàn)websocket即使通訊

    HTML5 擁有許多引人注目的新特性,如 Canvas、本地存儲、多媒體編程接口、WebSocket 等等。雖然現(xiàn)在大家把它捧的很火的樣子,但是個人認為它還需要其他平臺的支持才能真正的"火起來"
    2015-11-11
  • 在Ubuntu系統(tǒng)上安裝Ghost博客平臺的教程

    在Ubuntu系統(tǒng)上安裝Ghost博客平臺的教程

    這篇文章主要介紹了在Ubuntu系統(tǒng)上安裝Ghost博客平臺的教程,Ghost博客平臺以Node.js寫成,需要的朋友可以參考下
    2015-06-06
  • nodejs中各種加密算法的實現(xiàn)詳解

    nodejs中各種加密算法的實現(xiàn)詳解

    這篇文章主要給大家介紹了關(guān)于nodejs中各種加密算法的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用nodejs具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Express系列之multer上傳的使用

    Express系列之multer上傳的使用

    本篇文章主要介紹了Express系列之multer上傳的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 基于nodejs的雪碧圖制作工具的示例代碼

    基于nodejs的雪碧圖制作工具的示例代碼

    雪碧圖就是把很多小圖標(biāo)合并為一張圖片,這篇文章主要介紹了基于nodejs的雪碧圖制作工具的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Node.js中Express生成Token的實現(xiàn)方法

    Node.js中Express生成Token的實現(xiàn)方法

    本文介紹了在Express中生成和使用Token進行用戶認證的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12

最新評論

龙海市| 葫芦岛市| 临泉县| 福州市| 蒲城县| 响水县| 宁乡县| 广昌县| 建始县| 肥东县| 友谊县| 浦江县| 巴彦淖尔市| 山阳县| 芦山县| 阳新县| 沁源县| 象州县| 达拉特旗| 安图县| 富民县| 资源县| 沽源县| 类乌齐县| 华容县| 英吉沙县| 清丰县| 石柱| 上栗县| 河西区| 乐平市| 稻城县| 朝阳区| 汶上县| 西昌市| 芒康县| 左权县| 临泉县| 富阳市| 綦江县| 子洲县|