- 桌面应用
- 数据可视化
【免费下载链接】windirstat
Windows disk usage analyzer and cleanup tool with interactive treemaps, large-file discovery, duplicate detection, and file-system monitoring.
导读
WinDirStat(Windows Directory Statistics)是一款面向 Microsoft Windows 的磁盘空间使用分析与清理辅助工具,其核心价值在于:扫描驱动器、文件夹、网络共享乃至 MTP 设备后,通过可排序文件列表、文件类型统计与交互式矩形树图(treemap)、旭日图(sunburst)和火焰图(flame graph)直观呈现空间去向。本文以仓库根目录的 README.md 为主线,结合 windirstat/WinDirStat.cpp、windirstat/WinDirStatModel.Actions.cpp、windirstat/CsvLoader.cpp 等源码,系统讲解扫描与可视化的操作流程、/SaveTo等命令行导出模式、重复文件检测原理、删除文件恢复能力,以及安装与从源码构建的完整方案。读完本文,你将能独立完成一次"扫描 → 定位大文件 → 查找重复文件 → 导出报告 → 清理或恢复"的完整实战。
核心功能总览
WinDirStat 不是单一功能的"磁盘占用统计器",而是一条完整的存储分析工作链。根据 README 的 "Major features" 一节,其能力可归纳为六类:
- 多源扫描:可同时扫描多个驱动器或多个文件夹,支持暂停/恢复、刷新;以管理员身份运行时,本地 NTFS 卷可使用加速扫描模式。
- 多维度可视化:可探索最大文件、文件类型分布、逻辑大小与物理大小差异、硬链接,以及空闲/未知空间;矩形树图、旭日图、火焰图均可配置。
- 搜索与过滤:按名称、大小、文件/文件夹类型或所有者搜索已扫描结果;扫描前可按路径、名称、大小或使用年限过滤,且支持正则表达式。
- 重复文件检测:使用可配置的哈希算法,并带有云端文件(占位文件)防护;可选的稀疏哈希模式会把抽样匹配的结果标记为Probable duplicates(疑似重复)。
- 权限与成本分析:可检查文件与文件夹的权限条目(ACL),并按文件修改年限估算存储分层(存储层级)成本。
- 监控、导出与清理:监视文件系统变更;将扫描结果保存/加载为 CSV 或 JSON;从命令行导出扫描、重复文件或权限报告;可打开、移动、删除文件,运行 Windows 清理工具、NTFS 压缩、硬链接去重与自定义清理命令。
- 界面定制:可定制布局、列、颜色、字体与工具栏尺寸,支持深色模式、便携式设置、多语言翻译与 Explorer(资源管理器)集成。
从源码结构看,上述能力分别落在 windirstat/Controls(列表与图控件)、windirstat/Views(视图层)、windirstat/FinderNtfs.cpp(NTFS 加速扫描)、windirstat/FinderMtp.cpp(MTP 设备)与 windirstat/Item.Extended.cpp(哈希与硬链接处理)等模块中。
快速上手:从选择扫描源到导出快照
README 的 "Getting started" 给出了官方推荐的四步工作流,这里逐条展开并补充源码层面的印证。
第一步:选择扫描源
启动后,在Select Drives(选择驱动器)对话框中确定扫描范围:
- 勾选驱动器,或点击"添加文件夹"按钮选择Individual Folders(单个文件夹),多个文件夹可以同时扫描;
- 已连接的 MTP 设备(如手机、相机)会出现在Individual Drives(单个驱动器)分组下,这一行为与 windirstat/FinderMtp.cpp 中通过
IPortableDeviceManager枚举 WPD 设备、再以IShellItem绑定 shell 路径的实现对应; - 命令行传入的扫描目标同样支持多路径:见 windirstat/WinDirStat.cpp,非 flag 参数会被逐个规范化并追加到路径列表。
第二步:按需开启重复文件检测与提权扫描
- Scan for duplicate files(扫描重复文件)选项仅在你确实需要查找重复内容时开启——哈希过程会读取文件内容,增加磁盘 I/O 与扫描耗时。这一点在源码中有直接体现:windirstat/WinDirStat.cpp 在命令行保存模式下会自动切换该选项(
/SaveTo时关闭、/SaveDupesTo时开启),说明重复检测属于独立的、可选的计算阶段。 - 需要全盘加速扫描 NTFS 时,使用File > Run Elevated(以管理员身份运行)。提权后可直接读取卷的 MFT(主文件表)而非逐目录枚举,相关实现见 windirstat/FinderNtfs.cpp:它直接以
CreateFile打开卷名\$\MFT::$DATA,按 512 字节扇区应用 USN fixup 后逐条解析 MFT 记录。提权能力封装在 windirstat/HelpersTasks.cpp 的IsElevationAvailable()/RunElevated()中,并受 windirstat/Options.h 中AutoElevate、ShowElevationPrompt等选项控制。
第三步:浏览结果与切换可视化
- 在All Files(全部文件)列表排序,或直接打开Largest Files(最大文件)视图;
- 选中一个条目即可在可视化图中定位其位置;
- 使用
Ctrl+F调起搜索,按名称、大小、类型、所有者等条件检索; - 右键列标题可自定义显示列;
- 使用View菜单切换图形:矩形树图、旭日图、火焰图。菜单命令路由位于 windirstat/MainFrame.Commands.cpp(
SelectGraphPane、OnViewFlameGraph、OnViewSunburst),对应视图类分别为 windirstat/Views/TreeMapView.h、windirstat/Views/SunburstView.h、windirstat/Views/FlameGraphView.h 与 windirstat/Views/StorageAnalyticsView.h。
第四步:清理前核对,清理后刷新
- 在资源管理器中复核待清理条目后再执行操作;
- 清理后刷新受影响的扫描结果,使统计回归真实;
- 使用File > Save Results To CSV/JSON(将结果保存为 CSV/JSON)保留一份扫描快照,便于后续对比或归档。
此外,WinDirStat 还提供文件系统变更监视:扫描完成后可开启监视,底层通过ReadDirectoryChangesW递归监听目录变更(见 windirstat/Controls/FileWatcherControl.cpp),新增、删除、修改的文件会实时反映到监视列表。
命令行模式:无人值守扫描与报告导出
README 明确指出:脚本场景下使用/SaveTo、/SaveDupesTo或/SavePermsTo后跟输出文件名与扫描目标;保存模式写入报告后立即退出;/LoadFrom则重新打开已保存的扫描。这一部分的参数解析实现在 windirstat/WinDirStat.cpp 的ParseParam中,源码揭示了比 README 更精确的行为细节。
参数解析规则(源码级)
- flag 不区分大小写:解析时统一
MakeLower归一化; - 四个操作 flag:
saveToFlag(/SaveTo)、saveDupesToFlag(/SaveDupesTo)、savePermsToFlag(/SavePermsTo)、loadFromFlag(/LoadFrom)被定义为 operationFlags 数组,每个操作 flag 之后必须紧跟一个非 flag 参数作为其值; - 禁止重复操作:若命令行中出现多个操作 flag(例如同时
/SaveTo与/LoadFrom),会被标记为 malformed(m_malformedFlag),程序直接ExitProcess(1); - 扫描目标:所有非 flag 参数按空格切分(
SplitString),逐个校验为存在的文件夹后追加到目标列表,多个路径以管道符|连接;MTP 的 shell 路径(::前缀)走FinderMtp::IsPath/DoesFileExist分支,不做文件系统规范化; - 静默模式:存在任一保存 flag 时窗口以
SW_HIDE隐藏(windirstat/WinDirStat.cpp);若静默模式下没有扫描目标或目标路径无效,立即以退出码 1 终止; - 重复检测联动:
/SaveTo时强制关闭重复扫描(COptions::ScanForDuplicates = false),/SaveDupesTo时强制开启——这与第二步中"按需开启去重"的交互逻辑完全一致; - 退出码契约:导出成功返回 0、失败返回 1,便于脚本判断。
常用命令示例
:: 扫描 C 盘并把完整结果导出为 CSV,完成后自动退出 WinDirStat.exe /SaveTo results.csv C:\ :: 同时扫描两个文件夹并导出(多个目标以空格分隔) WinDirStat.exe /SaveTo results.csv "C:\Users\Me\Documents" "D:\Data" :: 扫描并导出重复文件报告(JSON),此模式自动开启重复检测 WinDirStat.exe /SaveDupesTo dupes.json "D:\Data" :: 导出指定路径的权限条目报告 WinDirStat.exe /SavePermsTo perms.csv "C:\Program Files" :: 直接加载此前保存的扫描结果,不发起新扫描 WinDirStat.exe /LoadFrom results.json导出与加载的底层实现
导出的执行点在 windirstat/WinDirStatModel.Actions.cpp:
/SaveTo→SaveResults(path, rootItem);/SaveDupesTo→ 先在消息线程中SortItems()排序重复列表,再SaveDuplicates(path, dupeRoot);/SavePermsTo→ 无界面扫描权限树(CFilePermsControl::ScanTree)后SavePermissions(path, rows)。
格式选择在 windirstat/CsvLoader.cpp:LoadResults依据扩展名分发到 JSON 或 CSV 解析器,并自动跳过 UTF-8 BOM,使用 1 MiB 输入缓冲。从 windirstat/CsvLoader.cpp 的 JSON 字段可知扫描结果报告包含:name(名称/路径)、files(文件数)、folders(文件夹数)、sizeLogical(逻辑大小)、sizePhysical(物理大小)、attributes(属性)、lastChange(最后修改时间),可选owner(所有者);重复文件报告(windirstat/CsvLoader.cpp)则包含hash、path、逻辑/物理大小、修改时间、属性,以及sampled标志——即该重复组是否来自抽样哈希(对应界面的Probable duplicates标记)。
重复文件检测:哈希算法与稀疏抽样
README 提到"可配置哈希 + 云文件防护 + 可选稀疏哈希(Probable duplicates)",源码将其落到了三个层次:
算法选择与默认值
windirstat/HelpersTasks.h 定义了两种可用算法:
HASH_MD5:基于 BCrypt 的 MD5;HASH_XXHASH:内嵌 xxHash 实现的 XXH3(64 位),默认选项。
windirstat/Options.h 中FileHashAlgorithm默认值为HASH_XXHASH,取值范围[HASH_MD5, HASH_XXHASH];SampleLargeFiles默认false(即默认全量哈希);LargeFileCount默认 50,控制"最大文件"列表的条目数。
哈希计算细节
windirstat/Item.Extended.cpp 的CItem::GetFileHash展示了完整的哈希管线:
- xxHash 路径:使用线程本地
XXH3_state_t*,XXH3_64bits_update增量更新,XXH64_canonicalFromHash输出 8 字节规范字节序摘要; - BCrypt 路径:
BCryptOpenAlgorithmProvider打开算法句柄并以BCRYPT_HASH_REUSABLE_FLAG创建可复用哈希对象,读满 1 MiB 缓冲后BCryptHashData更新; - 哈希截断:最终仅保留前 16 字节作为存储哈希——注释明确说明"去重检查不需要如此高的唯一性,SHA512 在 Windows 上符合 FIPS 且比 SHA256 更快,但截断后更省空间";
- 云文件防护与流读取:打开文件使用
FILE_FLAG_BACKUP_SEMANTICS(抽样模式)或FILE_FLAG_SEQUENTIAL_SCAN(顺序模式),MTP 文件则通过 shellBHID_Stream绑定到IStream读取(见 windirstat/HelpersTasks.cpp)。
稀疏哈希(Probable duplicates)
当启用SampleLargeFiles后(见 windirstat/Options.h),抽样逻辑在 windirstat/Item.Extended.cpp:
- 抽样总量固定为4 MiB(
sampled ? 4ull * wds::Mi : hashSizeLimit); - 采样策略为"完整前缀 + 三个均匀间隔的 1 MiB 块,最后一块直达文件末尾"(
const auto span = GetSizeLogical() - wds::Mi; offset = span / 3 * block + ...); - 读取采用
FILE_FLAG_RANDOM_ACCESS,用SetFilePointerEx/stream->Seek定位; - 抽样结果在界面与导出报告中标记为Probable duplicates(疑似重复,windirstat/CsvLoader.cpp 的
sampled字段),提醒用户这些匹配可能不精确。
需要说明的是:抽样哈希是"疑似"级别的匹配,若要获得可判定结论,应对候选组重新做全量哈希。同时 README 强调哈希会增加文件读取,因此仅在必要时开启重复检测。
硬链接处理与清理工具
- 硬链接:扫描阶段按需对每个驱动器创建 Hardlinks 项并执行大小调整(
CreateHardlinksItem/DoHardlinkAdjustment,见 windirstat/WinDirStatModel.Actions.cpp),使物理大小统计不被重复计数;对应选项ProcessHardlinks。 - NTFS 压缩与稀疏化:清理任务通过
DeviceIoControl下发FSCTL_SET_SPARSE与FSCTL_SET_ZERO_DATA将指定零区间去分配(见 windirstat/HelpersTasks.cpp),实现稀疏文件压缩。 - 硬链接去重:
CreateHardlinkFromFile先在目标目录创建带 GUID 的临时链接,再以MoveFileEx(MOVEFILE_REPLACE_EXISTING)原子替换目标,失败时清理临时链接(windirstat/HelpersTasks.cpp)。
删除文件恢复
README 明确:可在管理员权限下从本地 NTFS、exFAT 与 FAT 驱动器恢复已删除文件,恢复效果取决于幸存的文件元数据与文件数据。对应源码:
- windirstat/RecoveryShared.h 定义统一的
Scan/Recover抽象与ScanResult结构,并提供Open工厂按卷类型分发; - windirstat/RecoveryNtfs.cpp 实现 NTFS 恢复:解析 MFT 记录(
ParseRecord)、读取 MFT 运行段(GetMftRuns)、用卷位图判断簇空闲状态(BitmapFree/ClustersFree),再对每个待恢复记录调用RecoverFile; - 另有 windirstat/RecoveryExFat.cpp 与 windirstat/RecoveryFat.cpp 对应 exFAT/FAT 卷。
恢复属于高危操作:删除文件的元数据或数据块一旦被覆盖,就无法完整恢复,建议尽早执行并把恢复目标写到其他物理卷。
安装方式
README 推荐的安装方式是使用包管理器——便于后续更新:
| 安装途径 | 命令 / 入口 | 说明 |
|---|---|---|
| Microsoft Store | 商店内搜索 WinDirStat | 由商店托管安装与更新 |
| winget | winget install -e --id WinDirStat.WinDirStat | 后续更新用winget upgrade WinDirStat.WinDirStat |
| Chocolatey | choco install windirstat | 后续更新用choco upgrade windirstat |
| Scoop | scoop install extras/windirstat | 需先执行scoop bucket add extras |
仓库 setup/chocolatey 目录下存放着 Chocolatey 包的模板(chocolateyinstall.ps1.template、WinDirStat.nuspec.template等),供打包与本地构建参考。
手动安装包与便携版本
若偏好手动安装、需要便携版,或想浏览旧版本与测试版,可前往官方 GitHub Releases 页面下载;不确定选哪个文件时,64 位 MSI 安装包是通用推荐。各下载形态的适用场景如下表:
| 下载 | 适用人群 | 内容说明 |
|---|---|---|
| Microsoft Store 应用 | 想要一键安装与商店托管更新的用户 | 通过商店体验安装,更新由商店管理 |
| WinDirStat-x64.msi | 现代 Intel/AMD 64 位 Windows PC 上的大多数用户 | 标准 64 位安装程序,加入开始菜单 |
| WinDirStat-arm64.msi | Windows on ARM 设备(新款 Surface、Snapdragon 笔记本等) | 面向 ARM64 Windows 的标准安装程序 |
| WinDirStat-x86.msi | 较旧的 32 位 Windows 安装 | 标准 32 位安装程序 |
| MSIX bundle | 需要跨 CPU 类型部署(App Installer / 商店风格) | 若发布包含.msixbundle,可含多种 CPU 架构包,Windows 自动选择 |
| WinDirStat.zip | 便携使用、测试或免安装运行 | 解压后直接运行对应 CPU 架构的可执行文件 |
| WinDirStat.7z | 已装有 7-Zip 的便携用户 | 与 zip 同类的便携压缩包,体积通常更小 |
仓库 setup/msi 下提供了 WiX 安装工程(WinDirStat.wxs、Defines.wxi)与多语言脚本make-multilingual.ps1,setup/store 提供商店打包模板Package.appxmanifest.template,setup/prereqs.cmd 则用于准备构建前置环境。
安全警示:谨防仿冒站点
README 特别发出恶意软件警告:WinDirStat 的知名度引来了一些复制其名称、品牌或下载文件的非官方站点,这些站点可能提供过期或被篡改的文件并带来恶意软件风险。请仅通过上表列出的 Microsoft Store、包管理器渠道、官方 Releases 页面或官方网站安装;团队会尽可能举报仿冒站点,但下架并非总能成功。安装前请核对文件签名与来源。
兼容性
WinDirStat 2.x 针对以下系统开发与测试(README 声明:在更旧或更新的系统上"可能"可以运行,但不提供支持):
- Windows 7 / 8 / 8.1 / 10 / 11
- Windows Server 2008 R2 / 2012 / 2012 R2 / 2016 / 2019 / 2022 / 2025
此外,源码还体现了对旧系统的适配与安全加固:启动时通过SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32)限制 DLL 搜索路径以防范 DLL 劫持(仅 Windows 8 及以上生效),并有 windirstat/LegacyOsCompat.cpp 承载旧系统兼容逻辑。
从源码构建
README 的构建说明非常简洁:使用Visual Studio 2022 或更新版本,加载解决方案文件 windirstat.sln 即可。
仓库为构建提供了配套设施:
- windirstat/Build/Project.props:共享项目属性,集中管理编译参数;
- windirstat/Build/GitRevision.targets:构建时注入 Git 修订号;
- windirstat/windirstat.vcxproj 与 windirstat/windirstat.vcxproj.filters:主工程文件与筛选器;
- tests/ 目录提供 PowerShell 测试框架(
Test-WinDirStat.ps1、Run-Tests.cmd与 Harness/Scenarios 下的测试用例),可用于验证构建产物的基本行为; - 本地化文本以纯文本形式存放于 windirstat/res/langs/(含
lang_zh.txt、lang_zh-HK.txt等 20 余种语言),由 windirstat/Localization.cpp 在运行时加载;构建辅助脚本见 windirstat/Build/Compress Strings.ps1 与 windirstat/Build/Format Sources.ps1。
构建前请确认已安装 "C++ 桌面开发" 工作负载及对应 Windows SDK;若需复现安装包,可参考 setup/msi 的 WiX 工程与 setup/prereqs.cmd。
许可与资源
- 应用本体以GPL v3 或更高版本分发,许可证全文见 windirstat/res/license.txt;部分源码以更宽松的条款提供。
- Logo 及其衍生作品采用知识共享CC BY 3.0许可,Logo 文件位于 windirstat/logos/logo_256px.png(另有 logo_color.svg 矢量源)。
- 近期版本变更请查阅 CHANGELOG.md;历史贡献者、测试者与翻译者名单见 CONTRIBUTORS.md。
- 更完整的使用细节(如恢复文件的详细步骤、命令行与导出格式规范)收录于项目官方用户指南与参考文档,可从官方网站进入;技术讨论可关注项目官方博客与社区频道。
结语
WinDirStat 的价值在于把"磁盘满了"这个模糊问题转化为可定位、可量化、可操作的数据:交互式矩形树图让空间黑洞一目了然,重复文件检测与稀疏哈希在速度与精度之间提供调节旋钮,/SaveTo系列命令让扫描报告可以嵌入脚本与自动化流程,NTFS/exFAT/FAT 恢复能力则覆盖了清理之外的最后一环。以 README.md 为入口,结合本文梳理的源码路径,无论是日常排查磁盘空间,还是把扫描能力接入自己的工具链,你都能快速上手并深入底层原理。
- 桌面应用
- 数据可视化
【免费下载链接】windirstat
Windows disk usage analyzer and cleanup tool with interactive treemaps, large-file discovery, duplicate detection, and file-system monitoring.
相关推荐
根治WinDirStat重复文件扫描崩溃:从哈希冲突到线程安全的全栈修复
根治WinDirStat重复文件扫描崩溃:从哈希冲突到线程安全的全栈修复 问题背景:重复文件扫描的稳定性挑战 你是否遇到过WinDirStat在扫描大型磁盘时突
桌面应用数据可视化ZeroTermux 内置命令手册:quotacheck 命令扫描与维护磁盘配额文件的完整实践
ZeroTermux 内置命令手册:quotacheck 命令扫描与维护磁盘配额文件的完整实践 在 ZeroTermux 中, app/src/main/ass
移动开发开发工具Snyk CLI `cos target` 命令完全指南:创建、查看与导出 COS 扫描目标
Snyk CLI cos target 命令完全指南:创建、查看与导出 COS 扫描目标 导读 cos target 是 Snyk AI Pentesting(
应用安全漏洞扫描供应链安全CLI开发工具DevSecOps
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考