C#初学乍练-文本替换工具命令行版
2010-08-07 08:20
302 查看
该程序使用正则表达式进行文字替换,广度优先遍历子目录(基础知识很重要), 解决无法替换回车换行的问题
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);
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);
相关文章推荐
- Replace Pioneer 2.69 批量文本替换软件 批量文件重命名工具
- 文本提取与替换小工具
- Linux基础命令:文本处理工具之tr
- linux 文本处理工具之一grep命令详解
- 如何替换某文件中的所有的特定字符?---linux sed命令(文本编辑命令) (转载)
- Perl文本替换命令
- 如何替换某文件中的所有的特定字符?---linux sed命令(文本编辑命令)
- 利用正则表达式进行文本替换,编辑工具使用UE
- VIM文本替换命令
- vim下高级操作以及文本替换命令
- JAVA工具类(12)---文本字符串工具类(数据替换,加密解密操作)
- 怎样用DOS命令替换文本里的某段字符
- 2014-5-13-利用正则工具处理要替换的文本-屏蔽词
- vi部分命令. 替换操作; 文本格式转换; 在整个文件中替换; 在行首尾添加字符串.
- inux awk命令详解 awk文本分析工具
- VIM文本替换命令
- Linux基础命令:文本处理工具之cut
- shell 文本替换命令
- GrepWin:Win7下的文本替换工具
- VIM文本替换命令