Directory.GetFiles获取文件列表需用Path.Combine拼路径、单次调用仅支持一种通配符、递归需显式指定SearchOption.AllDirectories;重命名应直接File.Move,注意路径长度、非法字符过滤、预览备份。

用 Directory.GetFiles 获取文件列表时,路径和搜索模式怎么选
批量重命名的前提是准确拿到要处理的文件,Directory.GetFiles 是最常用入口,但容易因路径斜杠、通配符或递归逻辑出错。
- Windows 下路径末尾带不带
一般不影响,但拼接时建议统一用Path.Combine,避免手动拼"C:\folder\*.txt"这种硬编码 - 搜索模式别写
"*.jpg;*.png"——GetFiles不支持多后缀分号写法,得调两次或用EnumerateFiles+Where过滤 - 如果子目录也要处理,必须显式传
SearchOption.AllDirectories,默认只查当前层 - 注意权限:某些系统文件夹(如
C:Program Files)可能抛UnauthorizedAccessException,得加try/catch或提前检查Directory.GetAccessControl
重命名用 File.Move 而不是 File.Copy + Delete
有人图省事先复制再删原文件,这会浪费磁盘 I/O、增加出错概率,还可能破坏文件时间戳或 NTFS 属性。
-
File.Move是原子操作(同卷内),速度快且安全;跨卷才退化为复制+删除,但 .NET 会自动处理 - 目标路径已存在时,
File.Move直接抛IOException,必须自己判断:if (!File.Exists(newPath)) File.Move(oldPath, newPath); - 别忽略长路径问题:Windows 默认限制 260 字符,启用
longPathAware = true并用\?前缀(如@"\?" + fullPath)才能绕过
按规则生成新文件名时,Path.GetFileNameWithoutExtension 和 Path.GetExtension 别混用
常见错误是直接对全路径字符串做 Replace 或 Substring,结果把路径里的点或反斜杠也误处理了。
- 正确做法:用
Path.GetFileNameWithoutExtension(oldName)拿纯文件名,Path.GetExtension(oldName)拿扩展名,拼新名时再组合 - 如果规则含序号(如 “photo_001.jpg”),注意补零位数:
$"photo_{i:000}{ext}",别用字符串拼接"00" + i,i=5 时会变成 "005" 而不是 "005" - 非法字符必须过滤:Windows 禁止
, :, ", /, \, |, ?, *,可用string.Join("", name.Where(c => !Path.GetInvalidFileNameChars().Contains(c)))
执行前没预览、没备份,出错就只能手动翻回收站
批量操作没有“撤销”按钮,一次误操作可能覆盖几十个文件名,尤其当规则含 DateTime.Now.ToString("yyyyMMdd") 这类动态值时,重复运行结果不可逆。
- 务必先打印预览:用
Console.WriteLine($"{oldName} → {newName}")看前 5 个是否符合预期 - 关键场景加开关控制:用布尔变量
dryRun = true控制是否真调File.Move,确认无误再关掉 - 敏感目录建议先
Directory.CreateDirectory(backupPath),用File.Copy(oldPath, Path.Combine(backupPath, Path.GetFileName(oldPath)), true)备份原始文件 - 别依赖回收站——命令行或服务环境下删除的文件不进回收站,
File.Move重命名也不触发回收站记录
事情说清了就结束。真正麻烦的不是写代码,而是规则里藏着的边界情况:空文件名、同名冲突、只读属性、网络路径延迟、中文编码乱码……这些往往要跑一遍才暴露。











