网友作品 #000069 · 提交于 2026/08/08
文件批量重命名工具:9种规则叠加正则可撤销
★★★★★业余水平AI 编程工具国内其他模型dotnet

作品简介
FileRenamer 是一款 Windows 桌面批量重命名工具,采用 WPF + HandyControl 现代化界面,自绘标题栏,工具栏、文件列表与规则编辑区三栏布局。把文件或文件夹拖进窗口,添加一条或多条重命名规则,左侧列表实时显示「原名 → 新名」对照,确认后一键执行;改错了可以逐步撤销。项目按 MVVM 分层组织,配有单元测试与按日滚动的结构化日志。
核心亮点
- 9 种预设规则:添加前缀、添加后缀、序号(起始值/步长/补零位数/位置)、查找替换、大小写转换、删除字符、插入字符、修改扩展名、添加日期时间
- 自定义正则规则:正则模式 + 替换字符串,支持 $1 等分组引用,灵活处理复杂命名
- 规则可叠加:多条规则按列表顺序依次应用,可上下调整优先级,可勾选临时停用
- 实时预览:选中规则或改动参数,列表立刻同步显示新旧名称对照
- 撤销历史:最多保留 50 步重命名记录,一键回退(工具栏按钮或 Ctrl+Z)
- 添加灵活:工具栏添加文件/文件夹(可递归子目录),或直接拖入窗口任意位置
- 单个文件失败不阻断其他文件,失败条目高亮显示并提示错误信息;Serilog 按日滚动记录日志
- 双版本发布:约 69 MB 独立绿色版免安装直跑 Win10/Win11,约 2.3 MB 框架依赖版
技术与工具
- 运行时与 UI:.NET 8(net8.0-windows)、WPF、HandyControl 控件库
- 架构:MVVM 分层(CommunityToolkit.Mvvm),Models / ViewModels / Views / Services
- 日志与配置:Serilog 按日滚动写 logs 目录,appsettings.json 可调撤销步数与日志策略
- 质量保障:xUnit 单元测试 13 条核心用例全部通过,覆盖规则引擎与撤销管理器
- 发布:单文件打包、部分裁剪与压缩
开发过程
作者全程用 AI 编程工具 Trae 生成代码,消耗 300 多积分,用时约 1 小时完成开发并修复部分问题;随后补充了覆盖规则引擎与撤销管理器的 xUnit 单元测试,并整理出独立绿色版与框架依赖版两种发布产物。
适用场景
- 办公场景:批量整理文档、报表文件,按统一规则规范文件名,提升检索效率
- 媒体素材管理:批量重命名照片、视频素材,快速完成分类归档
原始提交内容(点开查看,可复制全文去问 AI)
FileRenamer · 批量重命名工具
一个基于 .NET 8 + WPF 的 Windows 桌面应用,用于对选定的文件 / 文件夹执行批量重命名。支持 9 种预设规则 + 自定义正则,规则可叠加,具备可排序的实时预览和撤销操作。
特性一览
| 类别 | 功能 |
|---|---|
| 界面 | WPF + HandyControl 现代化 UI,自绘标题栏(最小化 / 最大化 / 还原 / 关闭),工具栏+文件列表+规则编辑区三栏布局 |
| 预设规则 | 前缀、后缀、序号、查找替换、大小写转换、删除字符、插入字符、修改扩展名、添加日期时间(9 种) |
| 自定义规则 | 正则表达式模式 + 替换(支持 $1 等分组引用) |
| 规则组合 | 多条规则按列表顺序依次应用,支持上下调整优先级 |
| 文件来源 | 添加文件、添加文件夹(可递归 / 可包含文件夹本身)、直接拖入文件或文件夹 |
| 实时预览 | 左侧列表同步显示 “原名 新名”,选中规则或改动参数立刻看到效果 |
| ️ 撤销历史 | 保留最近 50 步 重命名操作,一键回退(工具栏按钮或 Ctrl+Z) |
| 质量保证 | xUnit 单元测试(13 条核心用例全部通过),覆盖所有规则引擎与撤销管理器 |
| 日志 | Serilog 结构化日志,按日滚动写入 logs/ 目录 |
9 种预设重命名规则
所有规则都包含“是否仅修改文件名(不含扩展名)“选项,可以单独控制作用域。
| # | 规则 | 主要参数 |
|---|---|---|
| 1 | 添加前缀 | 前缀文本 |
| 2 | 添加后缀 | 后缀文本 |
| 3 | 序号(编号) | 起始值 / 步长 / 位数(补零) / 位置(开头/结尾) / 与原名的分隔符 |
| 4 | 查找替换 | 查找文本 / 替换文本 / 忽略大小写 |
| 5 | 大小写转换 | 全部大写 / 全部小写 / 首字母大写 / 每单词首字母大写 / 大小写反转 |
| 6 | 删除字符 | 起始位置(从 0 开始) / 删除数量 |
| 7 | 插入字符 | 插入内容 / 插入位置(从 0 开始,负数表示倒序) |
| 8 | 修改扩展名 | 新扩展名(自动补.) |
| 9 | 添加日期时间 | 格式(yyyyMMdd / yyyy-MM-dd / yyyyMMddHHmmss / 可读 / HHmmss / 自定义) / 位置 / 连接符 / 使用文件创建时间或修改时间 |
| — | 自定义正则 | 正则模式 Pattern + 替换字符串 Replacement(支持 $1…$n 分组引用) |
多条规则按列表自上而下的顺序依次应用,可以通过规则列表上方的 ** ** 按钮调整执行顺序。
快速开始
方式一:直接运行已发布的 exe(推荐)
项目已生成两种发布形态,任选其一:
| 版本 | 路径 | 说明 | 大小 |
|---|---|---|---|
| 独立绿色版(推荐) | dist/self-contained/FileRenamer.exe |
完全免安装,任何 Win10 / Win11 x64 机器直接双击运行 | ~69 MB |
| 框架依赖版 | dist/framework-dependent/FileRenamer.exe |
体积更小,需要目标机已安装 .NET 8 Desktop Runtime | ~2.3 MB |
两个版本都已包含
appsettings.json和日志输出目录logs/。
方式二:从源码构建并运行
环境要求:
- .NET 8 SDK(Windows x64)
- 可选:Visual Studio 2022 / Rider / VS Code
# 进入解决方案根目录
cd d:\ZS2JZ_NET\ReName\FileRenamer
# 还原并构建
dotnet restore FileRenamer.sln
dotnet build FileRenamer.sln -c Debug
# 运行应用(或者双击 bin\Debug\net8.0-windows\FileRenamer.exe)
dotnet run --project src/FileRenamer/FileRenamer.csproj
构建 / 发布
运行单元测试
dotnet test tests/FileRenamer.Tests/FileRenamer.Tests.csproj
# 通过! - 失败: 0,通过: 13,已跳过: 0
发布为框架依赖版(小巧)
dotnet publish src/FileRenamer/FileRenamer.csproj `
-c Release -r win-x64 --self-contained false `
-p:PublishSingleFile=true -p:DebugType=embedded `
-o dist/framework-dependent
发布为独立免安装版(自包含 .NET 运行时)
dotnet publish src/FileRenamer/FileRenamer.csproj `
-c Release -r win-x64 --self-contained true `
-p:PublishSingleFile=true `
-p:EnableCompressionInSingleFile=true `
-p:DebugType=embedded `
-p:IncludeNativeLibrariesForSelfExtract=true `
-p:TrimMode=partial `
-o dist/self-contained
️ 操作说明与快捷键
| 操作 | 方法 |
|---|---|
| 添加文件 / 文件夹 | 顶部工具栏 ** 添加文件** / ** 添加文件夹** 按钮,或直接拖入窗口任意位置 |
| 移除条目 | 选中后点 ** 移除所选**,或 清空全部 |
| 全选 / 反选 / 日志 | 文件列表右上角按钮 |
| 打开所在位置 / 显示 | 列表项右键菜单(或双击) |
| 添加规则 | 右上规则面板下方的快捷按钮(+前缀、+后缀、+序号……) |
| 编辑规则参数 | 在规则列表中选中条目 右下面板会显示对应参数编辑模板 |
| 调整规则顺序 | 选中后按 ** ** 按钮 |
| 启用 / 停用某条规则 | 列表项左侧复选框(不删除,只是暂时不应用) |
| 执行重命名 | 顶部工具栏 ** 开始重命名** 或 Alt+E |
| 撤销上一步 | 顶部工具栏 ** 撤销上一步** 或按 Ctrl+Z(最多 50 步) |
| 拖动 / 最大化窗口 | 拖动顶部工具栏空白处移动,双击工具栏切换最大化/还原 |
| 窗口控制按钮 | 工具栏右上角自绘:最小化 / 最大化(还原) / 关闭(红色悬停提示) |
️ 撤销机制
- 每次” 开始重命名“操作会产生一条历史记录(包含所有受影响文件的原路径和新路径、错误信息、完成时间)
- 历史栈默认 最多保留 50 条(见
appsettings.jsonUndo.MaxHistoryCount) - 超过上限时,最旧的记录会被自动丢弃
- 撤销是“回滚每一个文件的重命名”,失败的会被跳过并写入日志
- 可以多次点击“撤销”依次回退,直到历史为空
️ 配置文件(appsettings.json)
{
"Logging": {
"LogDirectory": "logs",
"FileSizeLimitBytes": 5242880,
"RetainedFileCountLimit": 30
},
"Undo": {
"MaxHistoryCount": 50
}
}
| 配置项 | 默认值 | 说明 |
|---|---|---|
Logging.LogDirectory |
logs |
日志输出目录(相对于程序根目录) |
Logging.FileSizeLimitBytes |
5242880(5MB) |
单日志文件上限,超出自动滚动 |
Logging.RetainedFileCountLimit |
30 |
最多保留日志文件数,超出删除最早的 |
Undo.MaxHistoryCount |
50 |
撤销历史最大步数(超过自动抛弃最旧的) |
项目结构
FileRenamer/
src/
FileRenamer/ # 主程序(WPF 应用)
App.xaml / .cs # 应用入口:注册资源、日志、异常捕获
appsettings.json # 运行时配置
Assets/AppIcon/ # 应用图标
Models/
Enums/RuleType.cs # RuleType / CaseChangeMode / SequencePosition / DateTimeFormatType
RenameRule.cs # 单条重命名规则(所有参数)
RenameItem.cs # 列表中的文件/文件夹条目
RenameHistoryRecord.cs# 撤销历史记录
Services/
RenameEngine.cs # 核心:将规则链应用到文件名
FileScannerService.cs # 路径扫描(递归子目录、过滤)
FileRenameService.cs # 实际执行 IO 重命名 + 错误汇总
UndoHistoryManager.cs # 撤销历史栈(默认 50 步)
ShellService.cs # Shell 集成:打开文件夹、资源管理器高亮
LogService.cs # Serilog 日志初始化
ViewModels/
MainWindowViewModel.cs # 主窗口 VM:所有命令 / 状态
RuleEditorTemplateSelector.cs # 根据 RuleType 选对应 DataTemplate
Views/
MainWindow.xaml # 主窗口 UI(工具栏 / 列表 / 规则区 / 状态栏)
MainWindow.xaml.cs # 代码隐藏:拖拽、Win32 自绘标题栏钩子等
Resources/
EnumResources.xaml # 枚举下拉源(ObjectDataProvider)
RuleEditors.xaml # 9 种规则对应的数据模板 + 共享样式
ThemeOverrides.xaml # HandyControl 主题微调
tests/
FileRenamer.Tests/
CoreLogicTests.cs # 13 条 xUnit 单元测试(13/13 通过)
dist/
framework-dependent/ # 框架依赖版发布产物(约 2.3 MB)
self-contained/ # 独立绿色版发布产物(约 69 MB,免安装)
Directory.Build.props # 构建属性(LangVersion / ImplicitUsings 等)
FileRenamer.sln # 解决方案文件
README.md
单元测试覆盖范围
| 测试用例(节选) | 验证点 |
|---|---|
AddPrefix_ShouldPrepend_ToNameOnly |
前缀规则(仅文件名模式) |
AddSuffix_ShouldAppend |
后缀规则 |
SequenceNumber_ShouldAppend_WithPadding |
序号+补零+步长 |
FindReplace_CaseSensitive_And_IgnoreCase |
查找替换忽略大小写开关 |
CaseChange_Modes_All_Work |
5 种大小写转换模式 |
RemoveCharacters_ShouldTrimCorrectly |
按位置删除字符 |
InsertCharacters_AtStart_Middle_End |
任意位置插入字符 |
ChangeExtension_Replace_And_Append |
扩展名修改 |
AddDateTime_WithCustomFormat |
日期时间格式 + 使用文件时间 |
CustomRegex_WithGroups |
正则分组 $1 引用 |
MultipleRules_Applied_InOrder |
多条规则顺序执行 |
UndoManager_HistoryLimit |
撤销历史超过上限自动丢弃最旧记录 |
UndoManager_Undo_MarksAsUndone |
撤销状态变更 |
已通过! - 失败: 0,通过: 13,已跳过: 0
技术栈
| 类别 | 选择 |
|---|---|
| 运行时 | .NET 8 (net8.0-windows) |
| UI 框架 | WPF (Windows Presentation Foundation) |
| MVVM 库 | CommunityToolkit.Mvvm(ObservableObject + RelayCommand) |
| UI 控件库 | HandyControl(主题 / 按钮 / NumericUpDown) |
| 日志 | Serilog(按日滚动文件) |
| 配置 | Microsoft.Extensions.Configuration.Json |
| 测试 | xUnit |
| 发布 | 单文件打包(PublishSingleFile) / 部分裁剪 / 压缩 |
| 自绘窗口 | WindowChrome + Win32 Hook(WM_GETMINMAXINFO / WM_NCCALCSIZE + DWM) |
️ 日志与故障排查
- 所有操作日志写入程序目录下
logs/log-yyyyMMdd.txt - 未处理异常由
App.xaml.cs的DispatcherUnhandledException捕获,记录到日志后友好提示 - 单次重命名操作中单个文件失败不会阻断其他文件,失败条目的“新名称”列会变成粉红,鼠标悬停显示错误信息
备注
- 本项目采用 MVVM 分层(Models / ViewModels / Views / Services),便于后续扩展(新增规则只需:在
RuleType加枚举;RenameRule加参数属性;RenameEngine加分支;RuleEditors.xaml加对应DataTemplate) - 默认撤销步数 50、日志保留 30 天(5MB 单文件滚动),可在
appsettings.json按需调整 - 窗口使用 Win32 DWM 集成自绘标题栏,保留原生阴影、Aero 贴边和边缘缩放