Skip to content

Scanning and Performance

Struis ICT edited this page Aug 18, 2026 · 4 revisions

Scanning & performance

ClutterCutter picks the fastest scan method available for each drive. On Windows that means the NTFS MFT fast path where possible, with a FindFirstFileEx walker as the fallback. On Linux / macOS the portable GUI shares the same scan engine but always uses a portable std::fs walker — there's no MFT fast path off Windows.

MFT fast path (NTFS + Administrator)

On an NTFS drive, running as Administrator, ClutterCutter opens the raw volume (\\.\C:) and reads the Master File Table directly, then parses the records in parallel across your CPU cores. This is dramatically faster than walking the filesystem — a full C: drive of around two million files scans in roughly five seconds.

This is why ClutterCutter offers a one-click UAC relaunch on startup: elevation is what unlocks the MFT path.

If the MFT read fails for any reason — a dynamic disk, an unusual volume layout, a transient lock, or a removable NTFS device that won't open for raw access — ClutterCutter automatically falls back to the walker (below) for that drive rather than leaving it out of the results.

FindFirstFileEx walker (fallback)

When the MFT path isn't available — a non-NTFS drive, running without elevation, or an MFT read that failed — ClutterCutter uses a FindFirstFileEx walker with LARGE_FETCH. All size and modified-time data comes straight from the directory enumeration, so there are no extra per-file system calls (important over a network). The walker fans out across a fixed pool of worker threads (about one per CPU core); it never spawns a thread per folder, so even a very wide tree stays bounded — which matters on a slow volume where thread thrash would hurt more than it helps.

Junctions, symlinks & hard links

  • Directory junctions / symbolic links are not followed. Their target already lives elsewhere on the volume, so following them would double-count that data (and attach it under the wrong path). Both scan paths — MFT and walker — skip reparse-point directories the same way, so totals agree.
  • Hard-linked files (which WinSxS uses heavily) are counted once in MFT mode, by their canonical name. A tree-walking tool counts each path separately, so its totals can be higher. ClutterCutter's MFT total reflects what's actually consuming space on the disk.

Scan all drives

Scan all drives scans every fixed and removable volume, each on its own worker thread (volumes are independent, so this is safe and the wall-clock time is about the slowest single drive, not the sum). Drives are appended to the "All drives" overview one at a time as they finish, so you see results immediately, and each drive card shows a live progress percentage as its scan advances. Mapped network drives are not included in the sweep — scan a UNC path or a network location explicitly if you need it.

Once a drive has been scanned, clicking its sidebar card reuses the in-memory results and drills straight in — no rescan. A drive is only re-scanned when it hasn't been scanned yet, or when you explicitly refresh with F5.

Large / slow arrays (NAS, DAS, multi-TB volumes)

ClutterCutter is usable against big, slow storage, with a few things worth knowing:

  • The walker streams straight from directory enumeration with no extra per-file round-trips, and the bounded worker pool keeps concurrent I/O in check instead of hammering the array with thousands of parallel requests.
  • Cancellation (Stop / Esc) is honored between folders and between MFT chunks. A single directory read that is blocked on an unresponsive network share can only be cancelled once that call returns, so Stop may take a moment on a stalled mount.
  • A single-drive scan builds its tree once the volume finishes, so a multi-terabyte target shows a progress line before the list fills. Scan all drives is incremental across volumes.
  • Memory scales with the number of files (one lightweight entry per file when file-ranking views are used), so a volume with tens of millions of files needs a comparable amount of RAM for the in-memory tree.

Clone this wiki locally