综合

img lrb456

C#初学乍练-文本替换工具命令行版

发表于2004/9/28 11:09:00  596人阅读

该程序使用正则表达式进行文字替换,广度优先遍历子目录(基础知识很重要), 解决无法替换回车换行的问题
 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);

阅读全文
0 0

相关文章推荐

img
取 消
img