我正在尝试重命名我的程序在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();
}
}所以我需要弄清楚的是如何递归地搜索这些无效字符,将它们替换为实际的文件名本身。有谁有什么想法吗?
发布于 2010-06-10 23:57:41
当您以递归方式处理文件和目录时,很多时候使用DirectoryInfo类及其成员比使用静态方法更容易。有一个为你预先构建的树结构,所以你不需要自己管理它。
GetDirectories返回更多的DirectoryInfo实例,以便您可以遍历树,而GetFiles返回FileInfo对象。
这个家伙created a custom iterator递归地产生文件信息,当你把它与你现有的正则表达式工作结合起来,就会完成你的解决方案。
发布于 2010-06-10 23:50:52
File.Move()可以有效地重命名文件。基本上,你只需要
File.Move(fileNames, sanitized);在后一个循环中。
警告-可能会有重复的文件名,所以您必须建立一个策略来避免这种情况,比如在sanitized变量的末尾附加一个计数器。另外,应用适当的异常处理。
PS:当然,你不需要搜索像:\*这样的字符。
https://stackoverflow.com/questions/3015965
复制相似问题