先看截图

工具中一个重要的部分,是对文件编码的自动检测(选项为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文件循环引用的话,会导致无线递归,直到堆栈溢出死掉。虽然临时修正好了,但仍然不完善,等完全修正好了,我再重新发资源吧。如果谁有更好的方法,还望不吝赐教,先行谢过。