先看截圖

工具中一個重要的部分,是對檔案編碼的自動檢測(選項為Auto的情況)
此部分使用了第三方元件(NonCodeNet)
public string getFileEncoding(string filePath)
{
string uni = string.Empty;
Stream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
BinaryReader binReader = new BinaryReader(stream);
byte[] dat = new byte[stream.Length];
binReader.Read(dat, 0, dat.Length);
String cod = objNonCode.GetCodeName(ref dat, false);
uni = changeCode(cod);
binReader.Close();
stream.Close();
return uni;
}
private string changeCode(string cod)
{
string uni = string.Empty;
switch (cod)
{
case "SJIS":
uni = "shift-jis";
break;
case "JIS":
uni = "iso-2022-jp";
break;
case "EUC":
uni = "euc-jp";
break;
case "UNICODE":
uni = "utf-16";
break;
case "UTF7":
uni = "utf-7";
break;
case "UTF8":
uni = "utf-8";
break;
//case "BIN":
// uni = "";
// break;
default:
uni = "utf-8";
break;
}
return uni;
}
具體的編碼轉換部分:
private void encodeOneFile(string srcFile, string desFile, string strEncode, Encoding toEncode)
{
Encoding encode = Encoding.GetEncoding(strEncode);
FileStream fsSrc = new FileStream(srcFile, FileMode.Open, FileAccess.Read);
StreamReader srSrc = new StreamReader(fsSrc, encode);
FileStream fsDes = new FileStream(desFile, FileMode.Create);
StreamWriter swDes = new StreamWriter(fsDes, toEncode);
long fileLength = fsSrc.Length;
//8M緩沖區
//byte[] buffer = new byte[8 * 1024 * 1024];
char[] cbuff = new char[8 * 1024 * 1024];
int readLength = srSrc.Read(cbuff, 0, cbuff.Length);
long readCount = 0;
while (readLength > 0)
{
//swDes.Write(buffer, 0, readLength);
swDes.Write(cbuff, 0, readLength);
readCount += readLength;
int percentage = (int)(readCount * 100 / fileLength);
//readLength = srSrc.Read(buffer, 0, buffer.Length);
readLength = srSrc.Read(cbuff, 0, cbuff.Length);
}
srSrc.Close();
fsSrc.Close();
swDes.Close();
fsDes.Close();
}
實作編碼轉換的思路就是,以A編碼打開檔案srcPath/test.c,然後以B編碼儲存desPath/test.c,如此就實作了将檔案test.c從A編碼轉為B編碼。
好了,代碼就不一一貼了,整個項目我已經打包上傳到CSDN了,有需要的可以下載下傳看看。
http://download.csdn.net/detail/geeking/8049169
另:上篇部落格《c# 簡易繪制C語言頭檔案包含關系圖》中的代碼存在緻命bug,若H檔案循環引用的話,會導緻無線遞歸,直到堆棧溢出死掉。雖然臨時修正好了,但仍然不完善,等完全修正好了,我再重新發資源吧。如果誰有更好的方法,還望不吝賜教,先行謝過。