说明:
某日某天的某个时候,程序出现了日狗的情况,不得不对所有Unity创建的所有.cs脚本进行批处理(修改指定的字符串之类的),光不要说需要修改的.cs脚本有四五十个,一个个的修改不光修改浪费时间,而且害怕处理修改不全面的情况。。。于是乎,只有自己写一个批处理文件的控制台脚本处理所有的.cs脚本。
特别需要说明的是,由于需要遍历的文件太多以及涉及到递归操作,特意使用了线程在C#控制台中处理,在Unity中尝试过运行该脚本,容易出现卡死的情况。
遍历所有的.cs文件
/// <summary>
/// 获取所有的.cs文件
/// </summary>
public static List<string> FindAllFiles(string fileDicPath)
{
if (!Directory.Exists(fileDicPath))
{
Console.WriteLine("文件夹不存在");
return null;
}
List<string> fileList = new List<string>();
//遍历文件夹
DirectoryInfo theFolder = new DirectoryInfo(fileDicPath);
FileInfo[] thefileInfo = theFolder.GetFiles("*.cs", SearchOption.TopDirectoryOnly);
foreach (FileInfo NextFile in thefileInfo) //遍历文件
fileList.Add(NextFile.FullName);
//遍历子文件夹
DirectoryInfo[] dirInfo = theFolder.GetDirectories();
foreach (DirectoryInfo NextFolder in dirInfo)
{
FileInfo[] fileInfo = NextFolder.GetFiles("*.cs", SearchOption.AllDirectories);
foreach (FileInfo NextFile in fileInfo) //遍历文件
fileList.Add(NextFile.FullName);
}
return fileList;
}
读取单个.cs文件
/// <summary>
/// 读取单个的.cs文件内容
/// </summary>
static void ReadCSText(string path)
{
StreamReader sr = new StreamReader(path, Encoding.Default);
Console.WriteLine(path);
string text;
StringBuilder sb = null;
if ((text = sr.ReadToEnd()) != null)
{
sb = new StringBuilder(text);
//自行处理读取、修改的操作
//for (int i = 0; i < ChineseString.Count; i++)
//{
// //Console.WriteLine(ChineseString[i] + " " + key[i]);
// //line.Replace(ChineseString[i], key[i]);
// //sb.Replace(ChineseString[i], key[i]);
// //sb.Replace(ChineseString[i], key[i]);
// sb.Replace("Toast.ShowText(" + key[i], "Toast.ShowText(I2.Loc.LocalizationManager.GetTermTranslation(" + key[i] + ")");
//}
}
sr.Close();
if (sb != null)
{
var str = sb.ToString();
Console.WriteLine(str);
StreamWriter sw = new StreamWriter(path, false, Encoding.Default);
sw.Write(str);
sw.Flush();
sw.Close();
}
Console.WriteLine("完成");
}
读取所有的.cs文件
/// <summary>
/// 读取所有.cs文件的内容
/// </summary>
static void ReadAllCSText()
{
List<string> listPath = FindAllFiles(DicPath);
if (listPath == null)
return;
foreach (var varPath in listPath)
{
ReadCSText(varPath);
}
}
以线程的方式读取
static void Main(string[] args)
{
//路径自己修改
//DicPath = "E:/XXQQ_ProjectAssets/";
t = new Thread(ReadAllCSText);
t.Start();
Console.ReadKey();
}
关闭线程
void OnDestroy()
{
if (t != null)
{
t.Abort();
}
}