使用RegEx和递归更改FileNames

时间:2010-06-10 15:40:51

标签: c# regex file renaming

我正在尝试将我的程序列出的文件重命名为导入SharePoint文件的“非法字符”。我所指的非法字符是:〜#%& * {} / \ | :<> ? - “”

我要做的是通过驱动器递归,收集文件名列表,然后通过正则表达式,从列表中挑选文件名并尝试替换实际文件名中的无效字符。

任何人都知道如何做到这一点?到目前为止我有这个:(请记住,我是这个东西的完整n00b)

class Program
{
    static void Main(string[] args)
    {
        string[] files = Directory.GetFiles(@"C:\Documents and Settings\bob.smith\Desktop\~Test Folder for [SharePoint] %testing", "*.*", SearchOption.AllDirectories);
        foreach (string file in files)
        {
            Console.Write(file + "\r\n");


        }
        Console.WriteLine("Press any key to continue...");
        Console.ReadKey(true);



        string pattern = " *[\\~#%&*{}/:<>?|\"-]+ *";
        string replacement = " ";
        Regex regEx = new Regex(pattern);

        string[] fileDrive = Directory.GetFiles(@"C:\Documents and Settings\bob.smith\Desktop\~Test Folder for [SharePoint] %testing", "*.*", SearchOption.AllDirectories);
        StreamWriter sw = new StreamWriter(@"C:\Documents and Settings\bob.smith\Desktop\~Test Folder for [SharePoint] %testing\File_Renames.txt");
        foreach(string fileNames in fileDrive)
        {

        string sanitized = regEx.Replace(fileNames, replacement);
        sw.Write(sanitized + "\r\n");
        }
        sw.Close();



    }






}

所以我需要弄清楚的是如何递归搜索这些无效的字符,在实际的文件名本身中替换它们。有人有什么想法吗?

2 个答案:

答案 0 :(得分:1)

File.Move()有效地重命名文件。基本上,你只需要

File.Move(fileNames, sanitized);

在后一个循环中。

ALERT - 可能会有重复的文件名,因此您必须建立一个策略来避免这种情况,例如在sanitized变量的末尾添加一个计数器。此外,应用适当的异常处理。

PS:当然,您不需要搜索:\*等字符。

答案 1 :(得分:1)

当您以递归方式处理文件和目录时,很多时候使用DirectoryInfo类和它的成员而不是静态方法会更容易。有一个预先构建的树结构,所以你不必自己管理。

GetDirectories返回更多DirectoryInfo实例,以便您可以遍历树,而GetFiles返回FileInfo个对象。

此人created a custom iterator以递归方式生成文件信息,当您将其与现有的正则表达式工作结合使用时,将完成您的解决方案。