返回作品列表

网友作品 #000069 · 提交于 2026/08/08

文件批量重命名工具:9种规则叠加正则可撤销

★★★★★业余水平AI 编程工具国内其他模型dotnet

作品作者

ZS2JZ业余水平
开发工具
AI 编程工具
AI 模型
国内其他模型
使用 Skill
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.json Undo.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 贴边和边缘缩放