Skip to content
relmerPublic

About

Fast, multithreaded, customizable, colorized dir-style directory listing tool for Windows (x64/ARM64).

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

TCDir

CI Latest Release License: MIT

Install

For your convenience, TCDir is now available through winget:

winget install relmer.TCDir

About TCDir

TCDir ("Technicolor Directory") is a fast, colorized directory listing tool for Windows consoles. It's designed as a practical dir-style command with useful defaults (color by extension/attributes, Nerd Font file/folder icons, sorting, recursion, wide output, and a multi-threaded enumerator). Settings can be persisted in a config file (~\.tcdirconfig), overridden via the TCDIR environment variable, or specified on the command line.

TCDir tree listing that expands a .zip archive

What's New

Version Highlights
5.7 Browse archives as folders (--Archives: .zip, .iso, .7z, .rar, .tar.*, ...) and print archive statistics with checksum verification (--Info, --Verify). PowerShell tab completion for switches and values (--Enable-Completion)
5.6 Install/uninstall Nerd Fonts system-wide (--install-nerdfonts, --uninstall-nerdfonts) with Windows Terminal profile configuration
5.5 Variable-width columns in wide mode (/W) — GNU ls-style per-column fitting; outlier truncation with …
5.4 Symlink, junction, and AppExecLink target display (→ target); ellipsize long target paths (…)
5.3 Config file support (.tcdirconfig) — persistent settings without environment variables
5.2 Interactive PowerShell alias configuration (--set-aliases, --get-aliases, --remove-aliases)
5.1 --Tree hierarchical directory view with depth control
5.0 Nerd Font file/folder icons (~200 extensions, ~65 directories)
4.2 Cloud sync status badges (OneDrive, iCloud), file owner, NTFS alternate data streams
4.1 - and -- style switch prefixes
4.0 Multi-threaded enumeration (2–4× faster recursive listings), ARM64 native binary

See CHANGELOG.md for full release history.

Hat tip to Chris Kirmse whose excellent ZDir from the '90s was the original inspiration for TCDir.

Also available in Rust: RCDir is a parallel Rust implementation of TCDir with feature parity.

Why TCDir?

Feature dir TCDir eza lsd
Color-coded by extension & attribute — ✅ ✅ ✅
Cloud sync status (OneDrive, iCloud) — ✅ — —
Nerd Font file/folder icons — ✅ ✅ ✅
Tree view with full metadata — ✅ ✅ ✅
Multi-threaded enumeration — ✅ — —
Familiar dir switch syntax ✅ ✅ — —
ARM64 native binary ✅ ✅ — —
NTFS alternate data streams ✅ ✅ — —
Symlink/junction target display — ✅ ✅ ✅
Configurable via environment variable — ✅ ⚠️ ⚠️
Persistent config file — ✅ ✅ ✅
Browse inside archives (.zip, .iso, .7z, .rar, .tar.*, ...) — ✅ — —
Archive statistics and checksum verification — ✅ — —
Interactive PowerShell alias setup — ✅ — —
PowerShell tab completion — ✅ ✅ ✅
Nerd Font installer — ✅ — —

⚠️ eza and lsd read colors (LS_COLORS, EZA_COLORS) and, for eza, a few display settings from environment variables; TCDir reads switches and colors from TCDIR.

Manual installation

Download

If you're not a winget enthusiast, youc an grab the latest binary for your architecture directly:

Place the .exe somewhere on your PATH, or add its directory to your PATH.

See all releases on the Releases page.

Shell aliases

TCDir includes a built-in alias configuration wizard. Run from PowerShell:

tcdir --set-aliases

The wizard walks you through:

  1. Root alias — a short name (e.g., d) that maps to tcdir
  2. Sub-aliases — derived commands like dt (tree), dw (wide), dd (dirs-only), ds (recursive), dsb (recursive bare)
  3. Profile location — which PowerShell profile to save to, or output for the current session only

The generated aliases are PowerShell functions stored between marker comments in your profile. To inspect or remove them later:

tcdir --get-aliases       # show configured aliases
tcdir --remove-aliases    # interactive removal
tcdir --set-aliases --whatif  # preview without writing

Both PowerShell 7+ (pwsh) and Windows PowerShell 5.1 (powershell) are supported — the wizard auto-detects which version launched it.

Tab completion

Run this from PowerShell to add tab completion for tcdir and your aliases to your profile:

tcdir --Enable-Completion           # add or update the completion block
tcdir --Enable-Completion --whatif  # preview the block without writing
tcdir --Disable-Completion          # remove it; aliases stay

--set-aliases offers to enable completion as its last step, and regenerates the completion block when the aliases change. Completion works without aliases too.

Press Tab after tcdir --Tr for --Tree, or Ctrl+Space after tcdir -- for every switch with its description. Values complete too: -O:, -A:, -T:, --Size= and --TreeIndent=. Switches that are already on the command line, or that conflict with it, aren't offered, and words that aren't switches complete as paths. Candidates come from the installed tcdir each time Tab is pressed, so a newer tcdir offers its new switches without a new setup step. Windows PowerShell 5.1 doesn't pass words that start with a single - to completers, so in 5.1 use / (/W, /Tree) or -- (--Tree).

Requirements

  • Windows 10/11
  • PowerShell 7 (pwsh) to run the build/test scripts
  • Visual Studio 2026 (v18.x)
    • The free Community edition is fine, but any edition will work
    • Workload: Desktop development with C++
    • Individual components (usually included with the workload, but worth confirming):
      • MSVC v14x x64/x86 build tools
      • Windows 10/11 SDK
      • C++ unit test framework (to build/run the UnitTest project)
      • Optional (ARM64 builds/tests): MSVC v14x ARM64 build tools
    • The scripts use vswhere.exe to locate MSBuild and the test runner
  • Optional: VS Code (the repo includes .vscode/ tasks wired up to scripts/Build.ps1 and scripts/RunTests.ps1)

Quick start

Build:

  • Visual Studio: open TCDir.sln and Build Solution
  • VS Code: run a build task (e.g. Build Release x64 (no test))
  • Command line: pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\Build.ps1 -Configuration Release -Platform x64 -Target Build

Run:

  • .\x64\Release\TCDir.exe
  • .\ARM64\Release\TCDir.exe

Usage

Show help:

  • TCDir.exe -? TCDir help

Basic syntax:

  • TCDIR [drive:][path][filename] [-A[[:]attributes]] [-O[[:]sortorder]] [-T[[:]timefield]] [-S] [-W] [-B] [-P] [-M] [--Env] [--Config] [--Settings] [--Owner] [--Streams] [--Icons] [--Tree] [--Archives] [--Info] [--Verify] [--Depth=N] [--TreeIndent=N] [--Size=Auto|Bytes]

Common switches:

  • -A[:]<attributes>: filter by file attributes
  • -O[:]<sortorder>: sort results
    • both -oe and -o:e forms are supported
    • N name, E extension, S size, D date/time
    • prefix - to reverse
  • -T:<timefield>: select which timestamp to display and sort by
    • C creation time, A last access time, W last write time (default)
  • -S: recurse into subdirectories
  • -W: wide listing format
  • -B: bare listing format
  • -P: show performance timing information
  • -M: enable multi-threaded enumeration (default); use -M- to disable
  • --Env: show TCDIR environment variable help/syntax/current value
  • --Config: show .tcdirconfig config file help/syntax and resolved file path
  • --Settings: show current color/switch configuration with source tracking (default, config file, or env var)
  • --Owner: display file owner (DOMAIN\User format); not allowed with --Tree
  • --Streams: display NTFS alternate data streams
  • --Icons: enable Nerd Font file/folder icons; use --Icons- to disable
  • --Tree: hierarchical directory tree view; use --Tree- to disable
  • --Archives: list the contents of an archive file (.zip, .iso, .7z, .rar, .tar, ...) given as a path, and recurse into archive files with -S and --Tree; use --Archives- to disable
  • --Info: print statistics for each archive that matches the targets instead of a listing; with -S, archives in subfolders and inside other archives are reported too
  • --Verify: with --Info, read every archive entry and check its stored checksum
  • --Depth=N: limit tree depth to N levels (requires --Tree)
  • --TreeIndent=N: tree indent width per level, 1–8, default 4 (requires --Tree)
  • --Size=Auto|Bytes: Auto shows abbreviated sizes (e.g., 8.90 KB); Bytes shows exact comma-separated sizes. Tree mode defaults to Auto, non-tree defaults to Bytes
  • --set-aliases: interactive wizard to configure PowerShell aliases for tcdir
  • --Enable-Completion / --Disable-Completion: add or remove PowerShell tab completion for tcdir and its aliases
  • --get-aliases: display all configured tcdir aliases and their source profiles
  • --remove-aliases: interactive removal of tcdir aliases from profile files
  • --whatif: dry-run modifier for --set-aliases, --remove-aliases, --Enable-Completion or --Disable-Completion (preview only, no file changes)
  • --install-nerdfonts: download and install CaskaydiaCove Nerd Font system-wide, then optionally configure terminal profiles
  • --uninstall-nerdfonts: remove Nerd Font terminal configuration and optionally remove the installed font files

Attribute filters (/A:)

Standard attributes: D (directory), H (hidden), S (system), R (read-only), A (archive)

Cloud sync attributes (OneDrive, iCloud, etc.):

  • O - cloud-only placeholder files (not locally available)
  • L - locally available files (hydrated, can be dehydrated)
  • V - pinned/always available files (won't be dehydrated)

Extended attributes:

  • X - not content indexed (excluded from Windows Search)
  • I - integrity stream enabled (ReFS only)
  • B - no scrub data (ReFS only)
  • F - sparse file
  • U - unpinned (allow dehydration)

Use - prefix to exclude (e.g., /A:-H excludes hidden files).

Cloud file visualization

When browsing cloud-synced folders (OneDrive, iCloud Drive, etc.), TCDir displays sync status symbols:

  • ○ (hollow) - cloud-only placeholder, not available offline
  • ◐ (half) - locally available, can be dehydrated
  • ● (solid) - pinned, always available offline

When a Nerd Font is detected, the cloud symbols are automatically upgraded to dedicated NF glyphs (cloud-outline, cloud-check, pin).

Nerd Font icons

When TCDir detects a Nerd Font installed, it automatically displays file and folder icons next to each entry — in normal, wide, and bare listing modes.

Detection works via:

  1. GDI glyph probe — renders a canary glyph to confirm Nerd Font symbols are available in the active console font
  2. System font enumeration — checks whether any installed font's name contains "Nerd Font" or a "NF", "NFM", or "NFP" suffix
  3. WezTerm detection — WezTerm bundles Nerd Font symbols natively, so icons are enabled automatically
  4. ConPTY detection — Windows Terminal, VS Code terminal, and other modern terminals are recognized

Icon mappings (~200 extensions, ~65 well-known directories) are aligned with the Terminal-Icons PowerShell module default theme.

Use --Icons to force icons on, or --Icons- to force them off, regardless of detection.

Tree view (--Tree)

Tree mode displays the directory hierarchy with Unicode box-drawing connectors (├──, └──, │). All metadata columns (date, time, attributes, size, cloud status) appear at every level. Directories and files are sorted together (interleaved) rather than grouped.

  • tcdir --Tree — show full tree from the current directory
  • tcdir --Tree --Depth=2 — show only 2 levels deep
  • tcdir --Tree --TreeIndent=2 — narrower indentation (default is 4)
  • tcdir --Tree *.cpp — show only .cpp files; empty subdirectories are pruned

Tree mode uses abbreviated file sizes (--Size=Auto) by default for consistent column alignment across directories. Junction points and symlinks are listed but not expanded, preventing infinite cycles.

Incompatible with -W (wide), -B (bare), -S (recurse), --Owner, and --Size=Bytes.

  • Tree listing: TCDir.exe --Tree TCDir tree listing

Archive browsing (--Archives)

With --Archives, a path to an archive file lists the archive's contents, and -S and --Tree recurse into archive files as if they were directories. Archive files in a listing appear as files, with their usual size, date, color and icon, so listing a directory without -S or --Tree prints the same output as without the switch.

  • tcdir --Archives release.zip: list the root of the archive
  • tcdir --Archives release.zip\docs\*.md: list matching entries in a folder inside the archive
  • tcdir --Archives -S src: recurse through src and every archive in it
  • tcdir --Archives --Tree src: draw each archive's contents below the archive's file line

TCDir archive tree

Format Windows version
.zip, .iso (ISO 9660, Joliet, UDF) All supported versions
.7z, .rar, .tar, .tgz/.tar.gz, .tar.bz2, .tar.xz, .tar.zst, .cab, .cpio, .xar, .lzh Windows 11 23H2 and later (uses archiveint.dll, which ships with Windows)

Archives are read-only: tcdir never changes them, never extracts them to disk, and never mounts .iso images. Only the archive's file list is read, so listing a large .zip is fast. Compressed tarballs and solid .7z/.rar archives must be decompressed to find their entries, so they take longer. On Windows 11 23H2 and later, an archive stored inside another archive (outer.zip\inner.zip) is browsed too: tcdir decompresses it into memory to read its file list. Inner archives larger than 256 MB, and all inner archives on earlier Windows versions, are listed as files. In tree view with a file mask, an archive that does not match the mask appears only when it contains matching entries. Owner, stream and cloud columns are blank for archive entries. A corrupt or password-protected archive prints an error, and the rest of the listing continues.

Archive statistics (--Info)

--Info prints a block of statistics for each archive instead of a listing. It works with or without --Archives.

  • tcdir --Info release.zip: report one archive
  • tcdir --Info builds\*.zip: report every matching archive, followed by a summary
  • tcdir --Info outer.zip\inner.7z: report an archive stored inside another archive
  • tcdir --Info -S builds\*.7z: report matching archives in builds, its subfolders, and inside other archives at any depth
  • tcdir --Info --Verify release.zip: also read every entry and check the checksums the archive stores

TCDir --Info output

Every block lists the size on disk, the file, folder and nested-archive counts, the uncompressed size and ratio, the largest file, the deepest path, the date range, encryption, and a breakdown by extension. The blocks add these values for each format:

Format Details
.zip Compression methods with compressed and uncompressed sizes, encryption type (ZipCrypto, AES), the creating host and version, ZIP64, several disks, a self-extractor prefix, and the comment
.iso File systems (ISO 9660, Joliet, Rock Ridge, UDF revision), volume label and IDs, volume dates, sector count, and El Torito boot platforms
Others Format and compression filters, stream totals, links, owners, groups, permissions, and entries with extended attributes or ACLs

Listing switches (-W, -B, --Tree, -O, -A, -T, --Owner, --Streams, --Icons, --Size and the others that change listing output) can't be combined with --Info. Listing defaults in TCDIR or .tcdirconfig are ignored under --Info. --Verify requires Windows 11 23H2 or later. With --Verify, the run exits with a failure code when an entry is damaged.

Examples:

  • Recurse through subdirectories: TCDir.exe -s TCDir recursive listing

  • Wide listing: TCDir.exe -w TCDir wide listing

Configuration file (.tcdirconfig)

TCDir reads an optional config file at startup for persistent settings that don't require an environment variable.

Location:

  • PowerShell: $env:USERPROFILE\.tcdirconfig
  • CMD: %USERPROFILE%\.tcdirconfig
  • Typically: C:\Users\<you>\.tcdirconfig

The file uses the same Key=Value syntax as the TCDIR environment variable, with one setting per line. Comments start with #.

Example .tcdirconfig:

# Default switches
w
Owner
Icons

# Colors
.cpp=LightGreen
.h=LightGreen
.rs=LightRed
D=Cyan

# Icons
.py=Green,U+E606

# Tree defaults
Depth=3
TreeIndent=2
Size=Auto

Supported settings: all the same keys as the TCDIR environment variable — switches, colors, icons, display attributes, Depth=N, TreeIndent=N, Size=Auto|Bytes.

Precedence (lowest to highest):

  1. Built-in defaults
  2. Config file (.tcdirconfig)
  3. TCDIR environment variable
  4. Command-line switches

Settings from higher-precedence sources override lower ones. Non-conflicting settings from all sources are merged.

Error handling: syntax errors in the config file are reported with line numbers via --Config. A missing config file is silently ignored. UTF-8 encoding is required (with or without BOM); UTF-16 is rejected with a diagnostic.

Configuration (TCDIR environment variable)

TCDir supports customizing colors (and default switch behavior) via the TCDIR environment variable. The same syntax also works in the config file (one setting per line, without semicolons).

Syntax:

  • PowerShell: $env:TCDIR = "[<Switch>] | [<Item> | Attr:<fileattr> | <.ext>] = <Fore> [on <Back>][;...]"
  • CMD: set TCDIR=[<Switch>] | [<Item> | Attr:<fileattr> | <.ext>] = <Fore> [on <Back>][;...]

Note: Switch names in the TCDIR variable do NOT include prefixes (/, -, --). Use just the switch name (e.g., W, Owner, Streams).

Default switches

Enable default switches by including the switch name (in the TCDIR env var or .tcdirconfig):

  • W - enable wide listing by default
  • S - enable subdirectory recursion by default
  • P - enable performance timing by default
  • M - enable multi-threading by default (already on by default)
  • B - enable bare listing by default
  • Owner - display file ownership by default
  • Streams - display NTFS alternate data streams by default
  • Icons - enable Nerd Font icons by default; Icons- to force off
  • Tree - enable tree view by default; Tree- to force off
  • Archives - browse archive targets and recurse into archives by default; Archives- to force off
  • Depth=N - set default tree depth limit
  • TreeIndent=N - set default tree indent width (1–8)
  • Size=Auto / Size=Bytes - set default size display format

Color customization

Configure colors for display items, file attributes, and extensions:

Example:

  • PowerShell: $env:TCDIR = "W;D=LightGreen;S=Yellow;Attr:H=DarkGrey;.png=Black on Magenta"
  • CMD: set TCDIR=W;D=LightGreen;S=Yellow;Attr:H=DarkGrey;.png=Black on Magenta

Decoded breakdown of the example:

  • W sets the default switch /W (wide listing) on
  • D=LightGreen sets the Date display item color to LightGreen
  • S=Yellow sets the Size display item color to Yellow
  • Attr:H=DarkGrey sets the Hidden file attribute color to DarkGrey
  • .png=Black on Magenta sets the .png extension color to black text on a magenta background

Display items for color configuration:

  • D (Date), S (Size), N (Name), Attr (Attributes)
  • CloudOnly, Local, Pinned - cloud sync status symbol colors

Icon override (<.ext>=<Color>,U+<codepoint>):

  • Override the icon glyph for any extension: .rs=DarkRed,U+E7A8
  • Color-only override (keep default glyph): .js=Yellow
  • Glyph-only override (keep default color): .md=,U+F48A

File attribute colors (Attr:<letter>):

  • H (hidden), S (system), R (read-only), D (directory)

  • Here's an example of setting the TCDIR environment variable, then showing its effects: TCDir with TCDIR environment variable

To see the full list of supported colors and a nicely formatted explanation, use --Env.

  • Any errors in the TCDIR variable are shown at the end.
  • TCDir.exe --Env: TCDir --Env help

To see config file help and the resolved .tcdirconfig path, use --Config:

  • TCDir.exe --Config: TCDir --Config output

To see your current resolved configuration (all sources merged), use --Settings:

  • All configuration settings are displayed along with the source of each setting (default, config file, or env var).
  • Config file parse errors are shown with file path and line number.
  • TCDir.exe --Settings: TCDir --Settings output

Building

Build options

  • Visual Studio: open TCDir.sln and Build Solution
  • VS Code: the repo includes .vscode/ (tasks/launch/settings), with tasks wired up to scripts/Build.ps1 and scripts/RunTests.ps1
  • Command line: use the PowerShell build scripts below

Build scripts

  • Build: pwsh -File .\scripts\Build.ps1 -Configuration <Debug|Release> -Platform <x64|ARM64> -Target Build
  • Clean: pwsh -File .\scripts\Build.ps1 -Configuration <Debug|Release> -Platform <x64|ARM64> -Target Clean
  • Rebuild: pwsh -File .\scripts\Build.ps1 -Configuration <Debug|Release> -Platform <x64|ARM64> -Target Rebuild
  • Build both Release targets: pwsh -File .\scripts\Build.ps1 -Target BuildAllRelease

Build outputs land under:

  • x64\Debug\TCDir.exe, x64\Release\TCDir.exe
  • ARM64\Debug\TCDir.exe, ARM64\Release\TCDir.exe

Tests

Run unit tests:

  • pwsh -File .\scripts\RunTests.ps1

(Uses Visual Studio’s vstest.console.exe, discovered via vswhere.)

Versioning

TCDir uses manual MAJOR.MINOR.PATCH semantic versioning, bumped by hand in TCDirCore/Version.h. Details are in BUILD_VERSION.md.

License

MIT License. See LICENSE.

About

Fast, multithreaded, customizable, colorized dir-style directory listing tool for Windows (x64/ARM64).

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages