C# 使用正则表达式和递归更改文件名

C# 使用正则表达式和递归更改文件名,c#,regex,file,renaming,C#,Regex,File,Renaming,我正在尝试重命名我的程序列出的文件,这些文件包含SharePoint文件导入的“非法字符”。我指的非法字符是:~\%&*{}/\\\\\:?-“” 我要做的是在驱动器中递归,收集文件名列表,然后通过正则表达式,从列表中选择文件名,并尝试替换实际文件名中的无效字符 有人知道怎么做吗?到目前为止,我有这个:(请记住,我是一个完全不喜欢这种东西的人) 类程序 { 静态void Main(字符串[]参数) { string[]files=Directory.GetFiles(@“C:\Documents

我正在尝试重命名我的程序列出的文件,这些文件包含SharePoint文件导入的“非法字符”。我指的非法字符是:~\%&*{}/\\\\\:?-“”

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

有人知道怎么做吗?到目前为止,我有这个:(请记住,我是一个完全不喜欢这种东西的人)

类程序
{
静态void Main(字符串[]参数)
{
string[]files=Directory.GetFiles(@“C:\Documents and Settings\bob.smith\Desktop\~用于[SharePoint]%测试的测试文件夹”,“***”,SearchOption.AllDirectory);
foreach(文件中的字符串文件)
{
Console.Write(文件+“\r\n”);
}
Console.WriteLine(“按任意键继续…”);
Console.ReadKey(true);
字符串模式=“*[\\~\\\%&*{}/:?\\”-]+*”;
字符串替换=”;
正则表达式正则表达式=新正则表达式(模式);
字符串[]fileDrive=Directory.GetFiles(@“C:\Documents and Settings\bob.smith\Desktop\~用于[SharePoint]%测试的测试文件夹”,“***”,SearchOption.AllDirectory);
StreamWriter sw=new StreamWriter(@“C:\Documents and Settings\bob.smith\Desktop\~用于[SharePoint]%testing\File_Renames.txt的测试文件夹”);
foreach(fileDrive中的字符串文件名)
{
string sanitized=regEx.Replace(文件名,replacement);
sw.Write(已消毒+“\r\n”);
}
sw.Close();
}
}
所以我需要弄清楚的是如何递归搜索这些无效字符,并在实际文件名中替换它们。有人有什么想法吗?

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

File.Move(fileNames, sanitized);
在后一个循环中

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


PS:当然,当你递归处理文件和目录时,你不需要搜索像
:\*

这样的字符,很多时候,使用类及其成员而不是静态方法更容易。有一个预构建的树结构,所以你不必自己管理它

返回更多DirectoryInfo实例,以便您可以遍历树,同时返回对象


这个家伙递归地产生文件信息,当你将它与你现有的正则表达式工作结合起来时,它将完成你的解决方案。

我想他只是想把它们撕掉正则表达式做了你想做的事吗?我看了一下自定义迭代器链接。我要钻入的目录在哪里传递?
GetFilesRecursive(dirInfo)
--只需传递一个根目录信息我需要在这里放一个if/else语句吗?或者如果文件没有无效字符,它会自动跳过它?@yeahumok,您确实可以将
文件名
已消毒的
进行比较,以避免对
文件.Move()
进行不必要的调用。但是,请注意重复项(例如,
#File.txt
~File.txt
将命名为
File.txt
),并检查访问权限、磁盘空间和其他IO异常。
File.Move(fileNames, sanitized);