카테고리 없음

📁 폴더 용량 시각화 분석기 - 무료 실행파일 다운로드 (Windows용)

유현석 2025. 5. 24. 13:56

 

 

 

컴퓨터 하드디스크 정리할 때,
어떤 폴더가 용량을 많이 차지하는지 헷갈리신 적 없으셨나요?

이 프로그램은
용량 많은 폴더를 시각적으로 색으로 표시해주는 무료 툴입니다.


📦 프로그램 이름

Folder Analysis (윈도우 전용 .exe)


✅ 주요 기능

  • 📂 트리 구조 탐색기 (좌측)
  • 📊 폴더 정보 테이블 (우측)
    • 하위 폴더들의 파일 수, 총 용량(MB), 수정일
  • 🎨 용량 크기에 따라 배경색 자동 지정
    • 작을수록 연한 초록, 클수록 진한 빨강
  • 🧠 용량 시각화를 통해 정리 대상 폴더를 빠르게 파악 가능

📎 다운로드 링크

🟢 실행파일 (.exe) 바로 다운로드:
👉 folder_analysis.exe 다운로드

  • 설치 필요 없음
  • Windows 10 이상 권장
  • Google Drive 바이러스 검사 불가 메시지가 뜰 수 있습니다 → [계속 다운로드] 클릭

🖥️ 화면 미리보기

📁 내 문서/
├─ Downloads       🔴 4.8 GB
├─ Pictures        🟢 0.2 GB
├─ Projects        🟡 1.3 GB

 

용량이 클수록 진한 색상으로 표시되어
눈으로 바로 “무거운 폴더”를 인식할 수 있습니다.


🛠 기술 정보

  • 제작: Python 3.11 + PyQt5
  • 빌드: PyInstaller (--onefile --windowed)
  • 구조: TreeView + QTableWidget + QColor 기반 시각화

 

import sys
import os
import datetime
from PyQt5.QtWidgets import (
    QApplication, QWidget, QTreeView, QFileSystemModel, QVBoxLayout,
    QHBoxLayout, QTableWidget, QTableWidgetItem, QLabel, QSplitter
)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor, QBrush
from pathlib import Path
from collections import defaultdict

class FolderExplorer(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("🗂️ 용량 시각화 탐색기")
        self.setGeometry(100, 100, 1400, 800)

        layout = QHBoxLayout()
        self.setLayout(layout)

        # 좌측 TreeView
        self.model = QFileSystemModel()
        self.model.setRootPath("C:/")
        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.setRootIndex(self.model.index("C:/"))
        self.tree.setColumnWidth(0, 300)
        self.tree.clicked.connect(self.on_tree_clicked)

        # 우측 레이아웃
        right_layout = QVBoxLayout()

        self.dir_table = QTableWidget()
        self.dir_table.setColumnCount(5)
        self.dir_table.setHorizontalHeaderLabels(["폴더명", "파일 수", "크기(MB)", "수정일", "경로"])
        self.dir_table.setMinimumHeight(300)

        self.ext_table = QTableWidget()
        self.ext_table.setColumnCount(2)
        self.ext_table.setHorizontalHeaderLabels(["확장자", "파일 수"])

        right_layout.addWidget(QLabel("📁 폴더 정보 (용량에 따라 배경 색상 표시)"))
        right_layout.addWidget(self.dir_table)
        right_layout.addWidget(QLabel("📦 확장자 통계"))
        right_layout.addWidget(self.ext_table)

        splitter = QSplitter(Qt.Horizontal)
        splitter.addWidget(self.tree)
        right_widget = QWidget()
        right_widget.setLayout(right_layout)
        splitter.addWidget(right_widget)

        layout.addWidget(splitter)

    def on_tree_clicked(self, index):
        path = self.model.filePath(index)
        self.scan_folder(path)

    def scan_folder(self, folder_path):
        folder_data = []
        ext_data = defaultdict(int)

        try:
            subfolders = [f for f in os.listdir(folder_path) if os.path.isdir(os.path.join(folder_path, f))]
        except PermissionError:
            return

        for folder in subfolders:
            full_path = os.path.join(folder_path, folder)
            folder_size = 0
            file_count = 0

            try:
                for entry in os.listdir(full_path):
                    entry_path = os.path.join(full_path, entry)
                    if os.path.isfile(entry_path):
                        folder_size += os.path.getsize(entry_path)
                        file_count += 1
                        ext = Path(entry_path).suffix.lower()
                        ext_data[ext] += 1
                    elif os.path.isdir(entry_path):
                        try:
                            for subentry in os.listdir(entry_path):
                                sub_path = os.path.join(entry_path, subentry)
                                if os.path.isfile(sub_path):
                                    folder_size += os.path.getsize(sub_path)
                                    file_count += 1
                                    ext = Path(sub_path).suffix.lower()
                                    ext_data[ext] += 1
                        except:
                            continue
            except:
                continue

            try:
                last_mod = datetime.datetime.fromtimestamp(os.path.getmtime(full_path)).strftime('%Y-%m-%d %H:%M')
            except:
                last_mod = "알 수 없음"

            folder_data.append([
                folder,
                str(file_count),
                f"{folder_size / (1024**2):.2f}",  # MB
                last_mod,
                full_path
            ])

        # 최대 용량 계산 (색상 기준)
        size_list = [float(row[2]) for row in folder_data if float(row[2]) > 0]
        max_size = max(size_list) if size_list else 1

        # 디렉토리 테이블 채우기 (배경색 적용)
        self.dir_table.setRowCount(len(folder_data))
        for i, row in enumerate(folder_data):
            size_mb = float(row[2])
            color = self.get_color_by_size(size_mb, max_size)

            for j, val in enumerate(row):
                item = QTableWidgetItem(val)
                item.setBackground(QBrush(color))
                self.dir_table.setItem(i, j, item)

        # 확장자 테이블 채우기
        ext_items = sorted(ext_data.items(), key=lambda x: -x[1])
        self.ext_table.setRowCount(len(ext_items))
        for i, (ext, count) in enumerate(ext_items):
            self.ext_table.setItem(i, 0, QTableWidgetItem(ext if ext else "[없음]"))
            self.ext_table.setItem(i, 1, QTableWidgetItem(str(count)))

    def get_color_by_size(self, size_mb, max_size):
        """용량 기준으로 색상 결정 (작을수록 연녹, 클수록 빨강 계열)"""
        ratio = min(size_mb / max_size, 1.0)
        red = int(255 * ratio)
        green = int(255 * (1 - ratio))
        return QColor(red, green, 100)  # 예: (255,0,0)=빨강, (0,255,100)=녹색


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = FolderExplorer()
    window.show()
    sys.exit(app.exec_())

 

#폴더용량분석기 #파일정리툴 #PyQt5 #윈도우유틸 #무료다운로드 #Python프로그램 #시각화툴 #exe도구 #용량정리 #폴더시각화 #파일관리