Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
run: python -m pip install customtkinter darkdetect Pillow

- name: Byte-compile all sources
run: python -m compileall -q main.py app.py scanner.py file_utils.py analysis.py treemap_render.py thumbnails.py annotate.py imagenav.py updater.py version.py registry_installer.py simple_installer.py make_version_info.py
run: python -m compileall -q main.py app.py scanner.py file_utils.py analysis.py treemap_render.py thumbnails.py annotate.py imagenav.py duplicates.py trash.py updater.py version.py registry_installer.py simple_installer.py make_version_info.py

- name: Validate version resource generation
run: python make_version_info.py
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ jobs:
run: |
$tag = if ($env:INPUT_TAG) { $env:INPUT_TAG } else { "${{ github.ref_name }}" }
$ver = $tag -replace '^v', ''
# a build-only dispatch runs on a branch, whose name can contain '/'
# and other characters that are not legal in a file name
$ver = $ver -replace '[^0-9A-Za-z._-]', '-'
if (-not $ver) { $ver = "dev" }
Compress-Archive -Path dist_onedir\FolderLens\* -DestinationPath "FolderLens-$ver-win64.zip" -Force
Get-ChildItem FolderLens-*.zip
Expand Down
12 changes: 8 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# FolderLens

**A fast, modern folder size analyzer for Windows.**
See what's eating your disk — as a tree, a treemap, a top-files list, or a file-type breakdown.
See what's eating your disk — as a tree, a treemap, a top-files list, a file-type breakdown, or duplicate copies.

[![CI](https://github.com/MrHakan/FolderLens/actions/workflows/ci.yml/badge.svg)](https://github.com/MrHakan/FolderLens/actions/workflows/ci.yml)
[![Release](https://github.com/MrHakan/FolderLens/actions/workflows/release.yml/badge.svg)](https://github.com/MrHakan/FolderLens/actions/workflows/release.yml)
Expand All @@ -22,13 +22,14 @@ Grab the latest build from the [Releases page](https://github.com/MrHakan/Folder
## Features

FolderLens scans a whole directory tree **once** — in parallel, across up to 32
worker threads — then lets you explore it four different ways with zero
worker threads — then lets you explore it five different ways with zero
rescanning:

- 🌳 **Tree view** — expandable folder tree with a usage bar, size, item count, type, and date at every level. Expanding a folder is instant.
- 🗺️ **Treemap** — cushion-shaded map where every rectangle's area is its size, folders get their own header band, and **image files are painted with their own thumbnail** so you can recognise them at a glance. Hover for a **peek preview** of the picture, click a folder to zoom in, right-click to go back.
- 🏆 **Largest files** — the top 100 biggest files anywhere in the tree, with their locations and small inline previews.
- 🧩 **File types** — size and count broken down by category (video, image, code, …) with proportional bars.
- 👯 **Duplicates** — finds byte-identical copies and shows exactly how much space keeping one of each would free. Narrowed by size, then a head/tail sample, then a full hash, so almost nothing is read twice.

### Image viewer & annotation

Expand All @@ -48,7 +49,8 @@ Plus:
- 🔎 **Instant search** across the whole tree (Ctrl+F)
- 🧵 **Fully responsive** — scanning, zipping, deleting, and exporting all run off the UI thread, with live progress and a **Stop** button
- 🗑️ **Manage** — multi-select to zip, delete, or open in Explorer (right-click, toolbar, or Delete key); sizes update without rescanning
- 📤 **Export** the full report to CSV
- 📤 **Export** the full report to CSV, or the treemap itself as a PNG
- ♻️ **Recycle Bin** — deletions are undoable by default (permanent delete is a setting)
- 💽 **Disk usage** shown in the status bar (free / total)
- 🌗 **Light / dark** theme, remembered between sessions, along with your last folder and view
- ⬆️ **Auto-update** from GitHub releases
Expand Down Expand Up @@ -82,7 +84,7 @@ python main.py --version
| `F5` | Rescan current folder |
| `Ctrl+F` | Focus search |
| `Esc` | Clear search |
| `Delete` | Delete selected (tree / largest files) |
| `Delete` | Delete selected (tree / largest files / duplicates) |
| Double-click | Open folder / open image viewer |

In the image viewer:
Expand Down Expand Up @@ -127,6 +129,8 @@ FolderLens/
├── app.py # UI (customtkinter + ttk): views, image viewer, toolbars
├── scanner.py # single-pass parallel tree scanner
├── analysis.py # treemap layout, largest-files, type breakdown, CSV (pure, tested)
├── duplicates.py # size -> sample -> full hash duplicate detection (pure, tested)
├── trash.py # Recycle Bin / XDG trash, with a permanent-delete fallback
├── treemap_render.py # cushion shading, thumbnails, labels, hit-testing
├── thumbnails.py # background thumbnail decoding + LRU cache
├── annotate.py # annotation model, tools, undo/redo, export (pure, tested)
Expand Down
Loading
Loading