批量編碼轉化工具(實現文件編碼的自動檢測)


先看截圖

工具對.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文件循環引用的話,會導致無線遞歸,直到堆棧溢出死掉。雖然臨時修正好了,但仍然不完善,等完全修正好了,我再重新發資源吧。如果誰有更好的方法,還望不吝賜教,先行謝過。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM