본문 바로가기
개발/Node JS

Node JS - 폴더 내부의 전체 파일 개수 구하기 (Counting the Total Number of Files In Folder)

by 피로물든딸기 2024. 2. 8.
반응형

Node JS 전체 링크

 

지정한 경로에 대해 파일의 개수를 구하려면 fspath 모듈을 이용하면 된다.

폴더 내부에 폴더가 있다면 재귀적으로 함수를 호출해서 파일 개수를 누적한다.

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

const countFilesInDirectory = (dir) => {
  let count = 0;

  const items = fs.readdirSync(dir);

  for (const item of items) {
    const itemPath = path.join(dir, item);
    const stats = fs.statSync(itemPath);

    if (stats.isDirectory()) {
      count += countFilesInDirectory(itemPath); // 하위 폴더 파일 개수
    } else if (stats.isFile()) {
      count++;
    }
  }

  return count;
};

const folderPath = "./";
const totalFiles = countFilesInDirectory(folderPath);

console.log("Total files:", totalFiles);

 

만약 해당 폴더의 파일 개수를 포함해, 어떤 폴더가 있는지, 그리고 그 폴더의 파일 개수도 알고 싶다면,

다음과 같이 child 배열을 추가해서 재귀적으로 정보를 저장한다.

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

const countFilesInDirectory = (dir) => {
  let totalCount = 0;
  let child = [];

  const items = fs.readdirSync(dir);

  for (const item of items) {
    const itemPath = path.join(dir, item);
    const stats = fs.statSync(itemPath);

    if (stats.isDirectory()) {
      const { totalCount: subfolderCount, child: subfolders } = countFilesInDirectory(itemPath);

      child.push({
        totalCount: subfolderCount,
        name: itemPath,
        child: subfolders,
      });

      totalCount += subfolderCount;
    }
    else if (stats.isFile()) {
      totalCount++;
    }
  }

  return { totalCount, child };
};

// 파일 개수를 세고 싶은 상위 폴더의 경로를 지정합니다.
const folderPath = "./";
const { totalCount, child } = countFilesInDirectory(folderPath);

console.log("Total files in top folder:", totalCount);
console.log("Subfolders:", child);

 

오브젝트가 포함된 경우 위와 같이 [Object]로 출력되기 때문에

오브젝트를 재귀적으로 출력하도록 print 함수를 만든다.

const printAllObjects = (obj, depth = 0) => {
  for (const key in obj) {
    if (typeof obj[key] === "object" && obj[key] !== null) {
      const indent = "  ".repeat(depth);
      console.log(indent + key + ":");

      printAllObjects(obj[key], depth + 1);
    } else {
      const indent = "  ".repeat(depth);
      console.log(indent + key + ":", obj[key]);
    }
  }
};

 

출력 예시는 다음과 같다.

Total files in top folder: 156
Subfolders: [
  {
    totalCount: 74,
    name: 'globfiles',
    child: [ [Object], [Object], [Object] ]
  },
  {
    totalCount: 74,
    name: 'myfiles',
    child: [ [Object], [Object], [Object] ]
  },
  { totalCount: 1, name: 'test', child: [] },
  { totalCount: 2, name: 'test2', child: [ [Object] ] }
]
PS D:\github\auto-test\actions> node .\countFile.js
0:
  totalCount: 74
  name: globfiles
  child:
    0:
      totalCount: 9
      name: globfiles\abc1
   ...
2:
  totalCount: 1
  name: test
  child:
3:
  totalCount: 2
  name: test2
  child:
    0:
      totalCount: 1
      name: test2\test3
      child:

 

간단하게 json으로 변환하는 방법도 있다.

let json = JSON.stringify(child, null, 2);
console.log(json);

...

[
  {
    "totalCount": 74,
    "name": "globfiles",
    "child": [
   ...
  {
    "totalCount": 1,
    "name": "test",
    "child": []
  },
  {
    "totalCount": 2,
    "name": "test2",
    "child": [
      {
        "totalCount": 1,
        "name": "test2\\test3",
        "child": []
      }
    ]
  }
]

 

전체 코드는 다음과 같다.

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

const countFilesInDirectory = (dir) => {
  let totalCount = 0;
  let child = [];

  const items = fs.readdirSync(dir);

  for (const item of items) {
    const itemPath = path.join(dir, item);
    const stats = fs.statSync(itemPath);

    if (stats.isDirectory()) {
      const { totalCount: subfolderCount, child: subfolders } = countFilesInDirectory(itemPath);

      child.push({
        totalCount: subfolderCount,
        name: itemPath,
        child: subfolders,
      });

      totalCount += subfolderCount;
    }
    else if (stats.isFile()) {
      totalCount++;
    }
  }

  return { totalCount, child };
};

const folderPath = "./";
const { totalCount, child } = countFilesInDirectory(folderPath);

console.log("Total files in top folder:", totalCount);
console.log("Subfolders:", child);

const printAllObjects = (obj, depth = 0) => {
  for (const key in obj) {
    if (typeof obj[key] === "object" && obj[key] !== null) {
      const indent = "  ".repeat(depth);
      console.log(indent + key + ":");

      printAllObjects(obj[key], depth + 1);
    } else {
      const indent = "  ".repeat(depth);
      console.log(indent + key + ":", obj[key]);
    }
  }
};

printAllObjects(child);

let json = JSON.stringify(child, null, 2);
console.log(json);
반응형

댓글