You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:18:04