先看截圖
工具對.c,.h,.cpp,.txt文件進行轉換,其余類型文件,則僅僅拷貝到轉換后的輸出路徑。這種處理是為了轉換前和轉換后的項目結構保持不變。
工具中一個重要的部分,是對文件編碼的自動檢測(選項為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文件循環引用的話,會導致無線遞歸,直到堆棧溢出死掉。雖然臨時修正好了,但仍然不完善,等完全修正好了,我再重新發資源吧。如果誰有更好的方法,還望不吝賜教,先行謝過。