无法重命名与我的RegEx匹配的文件

时间:2010-06-29 17:22:35

标签: c# regex

我有一个“清理”“脏”文件名的应用。 “脏”文件名的文件名中包含#%&〜+ {}。我的应用程序所做的是查看它们是否与我定义的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&amp; 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

1 个答案:

答案 0 :(得分:1)

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

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