我正在尝试将我的程序列出的文件重命名为导入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();
}
}
所以我需要弄清楚的是如何递归搜索这些无效的字符,在实际的文件名本身中替换它们。有人有什么想法吗?
答案 0 :(得分:1)
File.Move()有效地重命名文件。基本上,你只需要
File.Move(fileNames, sanitized);
在后一个循环中。
ALERT - 可能会有重复的文件名,因此您必须建立一个策略来避免这种情况,例如在sanitized
变量的末尾添加一个计数器。此外,应用适当的异常处理。
PS:当然,您不需要搜索:\*
等字符。
答案 1 :(得分:1)
当您以递归方式处理文件和目录时,很多时候使用DirectoryInfo类和它的成员而不是静态方法会更容易。有一个预先构建的树结构,所以你不必自己管理。
GetDirectories返回更多DirectoryInfo实例,以便您可以遍历树,而GetFiles返回FileInfo个对象。
此人created a custom iterator以递归方式生成文件信息,当您将其与现有的正则表达式工作结合使用时,将完成您的解决方案。