nodejs 統計算指定字尾,格式的檔案

hjswlqd發表於2024-06-23

都是gpt生成的

可用版本

const fs = require('fs');
const path = require('path');

function countHtmlFiles(dirPath) {
  let count = 0;
  const files = fs.readdirSync(dirPath);
  files.forEach(file => {
    const filePath = path.join(dirPath, file);
    const stat = fs.statSync(filePath);
    if (stat.isFile()) {
      if (path.extname(filePath) === '.html') {
        count++;
      }
    } else if (stat.isDirectory()) {
      // 將遞迴呼叫得到的 count 值累加到當前 count 變數
      count += countHtmlFiles(filePath); 
    }
  });
  return count;
}

// 測試
const targetDir = './myDirectory'; // 替換為您的目標目錄
const htmlCount = countHtmlFiles(targetDir);
console.log(`目錄 ${targetDir} 中包含 ${htmlCount} 個 HTML 檔案。`);

不可用版本,

const fs = require('fs');
const path = require('path');

function countFilesByExtension(dirPath, extension) {
    return new Promise((resolve, reject) => {
        fs.readdir(dirPath, { withFileTypes: true }, (err, files) => {
            if (err) {
                reject(err);
            } else {
                let count = 0;
                files.forEach(file => {
                    if (!file.isDirectory()) {
                        const filePath = path.join(dirPath, file.name);
                        if (path.extname(filePath) === extension) {
                            count++;
                        }
                    }
                });
                resolve(count);
            }
        });
    });
}

// 示例:統計當前目錄下所有.html檔案的數量
const directory = '.';  // 當前目錄,可以根據需要修改為其他目錄路徑
const extension = '.html';

countFilesByExtension(directory, extension)
    .then(count => {
        console.log(`在目錄 '${directory}' 下,共有 ${count} 個 .${extension.slice(1)} 檔案。`);
    })
    .catch(err => {
        console.error('讀取目錄時出錯:', err);
    });

A: 上述nodejs版本,沒有遞迴呼叫目錄

Q: 您是對的,我之前的Node.js示例中確實沒有遞迴處理子目錄中的檔案。為了修正這一點,我們可以修改Node.js的示例程式碼,使其能夠遞迴地遍歷目錄及其所有子目錄來統計指定檔案型別的數量。下面是更新後的Node.js程式碼示例,實現了遞迴統計指定副檔名檔案的功能:

仍不可用版本

const fs = require('fs');
const path = require('path');

function countFilesRecursively(dirPath, extension, callback) {
    fs.readdir(dirPath, { withFileTypes: true }, (err, files) => {
        if (err) {
            return callback(err);
        }
        
        let count = 0;
        files.forEach((file) => {
            const filePath = path.join(dirPath, file.name);
            if (file.isDirectory()) {
                // 遞迴處理子目錄
                countFilesRecursively(filePath, extension, (recCount) => {
                    count += recCount;
                    if (--files.length === 0) {
                        callback(null, count);
                    }
                });
            } else if (path.extname(filePath) === extension) {
                count++;
                if (--files.length === 0) {
                    callback(null, count);
                }
            } else {
                if (--files.length === 0) {
                    callback(null, count);
                }
            }
        });
    });
}

// 示例:統計當前目錄及其子目錄下所有.html檔案的數量
const directory = '.';
const extension = '.html';

countFilesRecursively(directory, extension, (err, count) => {
    if (err) {
        console.error('讀取目錄時出錯:', err);
    } else {
        console.log(`在目錄 '${directory}' 及其子目錄下,共有 ${count} 個 .${extension.slice(1)} 檔案。`);
    }
});

相關文章