【问题标题】:Having Trouble Renaming Files that Match with my RegEx重命名与我的 RegEx 匹配的文件时遇到问题
【发布时间】:2026-01-04 19:30:01
【问题描述】:

我有一个“清理”“脏”文件名的应用程序。 “脏”文件名的文件名中有 #%&~+{}。我的应用程序所做的是查看它们是否与我定义的 RegEx 模式匹配,然后将其发送到名为 FileCleanUp 的方法,在该方法中“清理”文件并用“”替换无效字符。但是,我在运行此程序时注意到,我的 FileCleanup 方法仅适用于某些文件,而不适用于其他文件!

这是我的代码:

    public class SanitizeFileNames
{

    public void FileCleanup(List<string>paths)
    {
        string regPattern = (@"[~#&!%+{}]+");
        string replacement = "";
        Regex regExPattern = new Regex(regPattern);


        foreach (string files2 in paths)
            try
            {
                string filenameOnly = Path.GetFileName(files2);
                string pathOnly = Path.GetDirectoryName(files2);
                string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement);
                string sanitized = Path.Combine(pathOnly, sanitizedFileName);
                //write to streamwriter
                System.IO.File.Move(files2, sanitized);
            }
            catch (Exception e)
            { 
            //write to streamwriter

            }

            }

我测试了几个文件,其名称如下:~Test.txt、#Test.txt、+Text.txt、Test&Test.txt、T{e}st.txt、Test%.txt。

我无法重命名的有:~Test.txt、+Test.txt、T{e}st.txt

我对此进行了调试,但奇​​怪的是,它显示这些由于某种原因没有被重命名的文件在调试器上是正确的。它不是将 ~Test.txt 显示为“已清理”的文件名,而是 Text.txt。所以在应用端,它确实正确读取了我的 foreach 循环。

但是,我真的很困惑为什么它实际上并没有重命名这些文件。有人知道为什么会这样吗?它与 File.Move() 有关系吗?

编辑:在进一步测试中,我意识到它也不会重命名像这样的文件:~~test.txt 或 ##test.txt

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    你有一个空的 catch 块。为什么不打印出异常消息来看看发生了什么?

    我的猜测是文件名与正则表达式匹配,但您无法重命名文件,因为在 #Test.txt 重命名为该文件之后,名为 Test.txt 的文件已经存在。在再次运行程序之前尝试将其他文件重命名为~Test2.txt+Test3.txtT{e}st4.txt

    【讨论】:

    • 哈!多么简单,我什至没有想到 :) 非常感谢先生!
    • @yeahumok:很高兴为您提供帮助。避免此类命名冲突的一种方法是将每个 #%&amp;~+{} 替换为不同的有效字符,而不是仅仅删除它。
    • 知道我如何捕捉到无法重命名文件的事实,因为我的 Catch 块中的文件夹中已经存在一个重复文件的 b/c 文件?我是 C# 新手,错误日志记录对我来说仍然是一个新概念。
    • @yeahumok:你必须看看到底抛出了什么异常。我可能会尝试在到达 catch 块之前处理它,方法是在写入流之前检查sanitizedFileName 是否已经存在。
    最近更新 更多