该程序使用正则表达式进行文字替换,广度优先遍历子目录(基础知识很重要), 解决无法替换回车换行的问题 class Replacee { /// <summary> /// 替换文件中字符 /// </summary> /// <param name="fileFullName">文件全名</param> /// <param name="replacedBy">用于替换的字符串</param> /// <param name="findPattern">用于查找的字符串</param> /// <param name="isBackup">是否备份文件</param> private static void DoReplace(string fileFullName, string replacedBy, string findPattern, bool isBackup) { string result = string.Empty; string inputText = string.Empty; string replacement = replacedBy; string pat = findPattern; Regex r = new Regex(pat, RegexOptions.IgnoreCase); try { using (StreamReader sr = new StreamReader(fileFullName)) { inputText = sr.ReadToEnd(); } // Compile the regular expression. if (r.IsMatch(inputText)) { if (isBackup == true) { try { File.Copy(fileFullName, fileFullName + ".bak"); } catch(System.IO.IOException ex) { File.Copy(fileFullName, fileFullName + ".bak", true); Console.WriteLine(ex.Message); } } result = r.Replace(inputText, replacement); // Add some text to the file. using (StreamWriter sw = new StreamWriter(fileFullName)) { sw.Write(result); } } Console.WriteLine(fileFullName); } catch (Exception e) { Console.WriteLine("The process failed: {0}", e.ToString()); //throw(e); } } /// <summary> /// 遍历目录 /// </summary> /// <param name="path">起始路径</param> /// <param name="replacedBy">用于替换的字符串</param> /// <param name="findPattern">用于查找的字符串</param> /// <param name="isBackup">是否备份文件</param> /// <param name="isGetSubFloder">是否获取子文件夹</param> public static void TravelReplace(string path, string replacedStr, string findPattern, bool isBackup, bool isGetSubFloder) { Queue queue = new Queue(); DirectoryInfo di = null; string subPath = string.Empty; string currentPath = string.Empty; FileSystemInfo[] dirs = null;
queue.Enqueue(path); while (queue.Count > 0) { currentPath = (string)queue.Dequeue(); di = new DirectoryInfo(currentPath); //get files under current directiory FileSystemInfo[] files = di.GetFiles("*.sql"); foreach (FileSystemInfo f in files) { DoReplace(f.FullName, replacedStr, findPattern, isBackup); }
// Get only subdirectories if (isGetSubFloder == true) { dirs = di.GetDirectories(); foreach (FileSystemInfo d in dirs) { subPath = d.FullName; queue.Enqueue(subPath); Console.WriteLine(subPath); } } } } }
测试:
Replacee.TravelReplace(@"E:\temp\ttt", "\r\n);", @"(\r\n){2,}\);", true, true);

|