C#批量重命名PNG文件时如何跳过文件名含#加任意数字的文件
实现方案
前置修改:引入正则命名空间
在代码文件的最顶部添加正则库引用,用来匹配文件名中的#+数字组合:
using System.Text.RegularExpressions;
核心逻辑调整
仅需要修改RenameCurrentPng方法,添加跳过规则,同时优化计数器逻辑,避免跳过的文件占用编号导致序号跳空:
private void RenameCurrentPng(string directoryPath) { int fileNameSuffixCounter = 1; // 预编译正则规则,匹配任意#加数字的组合,规则可复用提升性能 Regex hashNumberRegex = new Regex(@"#\d+", RegexOptions.Compiled); foreach (string originalFullFileName in Directory.EnumerateFiles(directoryPath, "*.png")) { // 获取不含路径的纯文件名用于检测 string fileName = Path.GetFileName(originalFullFileName); // 已包含#加数字组合的文件直接跳过 if (hashNumberRegex.IsMatch(fileName)) { continue; } // 生成新文件名 var newFileName = $"{Path.GetFileNameWithoutExtension(originalFullFileName)}#{fileNameSuffixCounter}{Path.GetExtension(originalFullFileName)}"; FileSystem.RenameFile(originalFullFileName, newFileName); // 仅成功重命名后再递增计数器,保证序号连续 fileNameSuffixCounter++; } }
完整修改后全部代码
using System.Text.RegularExpressions; // 其他原有命名空间保留即可 private void button1_Click(object sender, EventArgs e) { FolderBrowserDialog folderDlg = new FolderBrowserDialog(); if (folderDlg.ShowDialog() != DialogResult.OK) { return; } RenameAllPngFiles(folderDlg.SelectedPath); } private void RenameAllPngFiles(string directoryPath) { RenameCurrentPng(directoryPath); foreach (var item in GetDirectoryInfos(directoryPath)) { RenameCurrentPng(item.FullName); } } private void RenameCurrentPng(string directoryPath) { int fileNameSuffixCounter = 1; Regex hashNumberRegex = new Regex(@"#\d+", RegexOptions.Compiled); foreach (string originalFullFileName in Directory.EnumerateFiles(directoryPath, "*.png")) { string fileName = Path.GetFileName(originalFullFileName); if (hashNumberRegex.IsMatch(fileName)) { continue; } var newFileName = $"{Path.GetFileNameWithoutExtension(originalFullFileName)}#{fileNameSuffixCounter}{Path.GetExtension(originalFullFileName)}"; FileSystem.RenameFile(originalFullFileName, newFileName); fileNameSuffixCounter++; } } private DirectoryInfo[] GetDirectoryInfos(string directoryPath) { DirectoryInfo di = new DirectoryInfo(directoryPath); DirectoryInfo[] directories = di.GetDirectories("*", System.IO.SearchOption.AllDirectories); return directories; }
逻辑说明
- 正则规则
#\d+可以匹配任意#后接1位或多位数字的组合,不管是#1、#5、#123都可以正确识别 - 跳过的文件不会占用计数器序号,新生成的文件名编号会保持连续
- 正则使用预编译模式,批量处理大量文件时性能更优
内容的提问来源于stack exchange,提问作者mallu Crypto Nerd
相关产品推荐
相关产品推荐

