Cross-platform disk/volume resolver — given a path, tells you which disk it's on, its mount point, relative path, disk usage, and per-volume capabilities (case-sensitivity, filesystem type)
Installation
As a library
[]
= "0.5"
As a CLI tool
CLI Usage
Resolve a path
# Resolve the current working directory
# Resolve a specific path
# Output as JSON
# Output as YAML
# Combine options
Default output:
device="/dev/disk3s5"
mount_point="/System/Volumes/Data"
relative_path="Users/user/Develop/personal/whichdisk"
total=926.35 GiB
available=701.81 GiB
used=224.55 GiB
JSON output (-o json):
List mounted volumes
# List all mounted volumes
# Shorthand
# Skip ejectable/removable volumes (show only internal disks)
# Skip non-ejectable volumes (show only removable disks)
# Output as JSON
# Output as YAML
Default output:
mount_point="/" device="/dev/disk3s1s1" total=926.35 GiB available=701.81 GiB used=224.55 GiB
JSON output (list -o json):
Library Usage
Resolve a path to its disk
use resolve;
Get the root filesystem
use root;
List mounted volumes
use ;
Volume capabilities
Every MountPoint / PathLocation also reports the volume's case-sensitivity, case-preservation, and filesystem type. Capability values are Option<bool> where None means "unknown on this platform/filesystem" — never conflated with Some(false).
use resolve;
Feature Flags
| Feature | Default? | Description |
|---|---|---|
disk-usage |
Yes | Enables total_bytes(), available_bytes(), and used_bytes() |
list |
Yes | Enables list(), list_with(), and ListOptions |
cli |
No | Builds the whichdisk CLI binary |
To use only the core resolve() API with minimal dependencies:
[]
= { = "0.5", = false }
Supported Platforms
| Platform | Resolve backend | List backend | Ejectable detection |
|---|---|---|---|
| macOS, iOS, watchOS, tvOS, visionOS | statfs via rustix |
NSFileManager via objc2-foundation |
NSURLVolumeIsEjectableKey / NSURLVolumeIsRemovableKey |
| FreeBSD, OpenBSD, DragonFlyBSD | statfs via rustix |
getmntinfo via libc |
/dev/da* or /dev/cd* device prefix |
| NetBSD | statvfs via libc |
getmntinfo via libc |
/dev/sd* or /dev/cd* device prefix |
| Linux | /proc/self/mountinfo parsing |
/proc/self/mountinfo parsing |
/dev/disk/by-id/usb-* |
| Windows | GetVolumePathNameW via windows-sys |
FindFirstVolumeW / FindNextVolumeW |
GetDriveTypeW = DRIVE_REMOVABLE |
Volume capabilities (case_sensitive() / case_preserving() / fs_type()) are sourced per-OS: Apple via getattrlist (VOL_CAP_FMT_CASE_SENSITIVE / VOL_CAP_FMT_CASE_PRESERVING), Windows via GetVolumeInformationW, and elsewhere from the filesystem type. They follow a None-means-unknown contract — Some(..) only when the platform or filesystem type definitively proves the answer.
Performance
- Thread-local cache — repeated lookups for paths on the same device skip the underlying syscall/file read entirely
- Small-buffer optimization — mount points and device names (typically < 56 bytes) are stored inline on the stack; longer values use reference-counted
bytes::Bytes(clone is a pointer copy) - SIMD-accelerated scanning — uses
memchrfor null-terminator and newline searches in the BSDstatfsbuffers and Linux mountinfo parsing
MSRV
The minimum supported Rust version is 1.85.
License
whichdisk is under the terms of both the MIT license and the
Apache License (Version 2.0).
See LICENSE-APACHE, LICENSE-MIT for details.
Copyright (c) 2026 Al Liu.