C#检查目录下所有文件的编码格式并转换为UTF8格式
来源:互联网 发布:java 对象的大小 编辑:程序博客网 时间:2024/05/16 17:35
1、检查目录下所有文件的编码格式(递归)
2、将不是utf8的格式转换为UTF8格式
.config
<appSettings> <add key="ExceptList" value=".git,.nuget,.vs,.dll,.pdb, .png,.jpg,.gif ,.log,.eot, .ttf, .woff, .swf, packages , ReferenceDLL ,.cache,.xls, .xlsx,.doc,.docx,favicon.ico,_references.js,.exe" /> <add key="isChangeToUTF8" value="true" /> </appSettings>
public partial class Form1 : Form { public Form1() { InitializeComponent(); this.txt_url.Text = "G:\\WorkSpace\\messagecenter"; } private static List<string> ExceptList = new List<string>(); private static bool isChangeToUTF8 = false; private List<string> ResultList=new List<string>(); static Form1() { System.Configuration.AppSettingsReader appReader = new System.Configuration.AppSettingsReader(); string strExcept= Convert.ToString(appReader.GetValue("ExceptList", typeof(string))); string strIsChange = Convert.ToString(appReader.GetValue("isChangeToUTF8", typeof(string))); if (!string.IsNullOrEmpty(strExcept)) { var tempExcept = strExcept.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var temp in tempExcept) { ExceptList.Add(temp.Trim()); } } if (!string.IsNullOrEmpty(strIsChange) && strIsChange.ToUpper()=="TRUE") { isChangeToUTF8 = true; } } private void btn_start_Click(object sender, EventArgs e) { ResultList = new List<string>(); string myPath = txt_url.Text; if (string.IsNullOrEmpty(myPath)) { MessageBox.Show("PATH?"); return; } List<string> pathList = new List<string>(); try { //查找目录下的所有文件 GetDirectory(myPath, pathList); foreach (var path in pathList) { //获取文件编码格式 var type = EncodingType.GetType(path, ResultList); if (type != Encoding.UTF8) { ResultList.Add($"{path},原格式{type.EncodingName}"); if (isChangeToUTF8) { //转换编码格式至UTF8 ChangeEncoding(path, type); } } } } catch (Exception exception) { MessageBox.Show(exception.ToString()); return; } if (ResultList.Any()) { ResultList.Insert(0,myPath); ResultList.Insert(1,$"共计文件{pathList.Count}个"); ResultList.Insert(2,$"非UTF-8文件共{ResultList.Count-2}个"); byte[] myByte = System.Text.Encoding.UTF8.GetBytes(string.Join(Environment.NewLine, ResultList.ToArray())); using (FileStream fsWrite = new FileStream($"D:\\result{DateTime.Now.ToString("yyyyMMddHHmmss")}.txt", FileMode.Append)) { fsWrite.Write(myByte, 0, myByte.Length); }; MessageBox.Show("D:\\result.txt"); } else { ResultList.Insert(0, myPath); ResultList.Insert(1, $"共计文件{pathList.Count}个"); ResultList.Insert(2, $"非UTF-8文件共{ResultList.Count - 2}个"); byte[] myByte = System.Text.Encoding.UTF8.GetBytes(string.Join(Environment.NewLine, ResultList.ToArray())); using (FileStream fsWrite = new FileStream($"D:\\success{DateTime.Now.ToString("yyyyMMddHHmmss")}.txt", FileMode.Append)) { fsWrite.Write(myByte, 0, myByte.Length); }; MessageBox.Show("finish!"); } } private void GetDirectory(string path, List<string> list) { DirectoryInfo folder = new DirectoryInfo(path); GetFile(path,list); foreach (var directory in folder.GetDirectories()) { if (!ExceptList.Contains(directory.Name)) { string childPath = $"{path}\\{directory.Name}"; GetDirectory(childPath, list); } } } private void GetFile(string path, List<string> list) { DirectoryInfo folder = new DirectoryInfo(path); foreach (FileInfo file in folder.GetFiles()) { if (!ExceptList.Any(e => file.Name.EndsWith(e))) { list.Add($"{path}\\{file.Name}"); } } } private void ChangeEncoding(string filename , System.Text.Encoding encoding) { System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read); byte[] flieByte = new byte[fs.Length]; fs.Read(flieByte, 0, flieByte.Length); fs.Close(); StreamWriter docWriter; System.Text.Encoding ec = System.Text.Encoding.GetEncoding("UTF-8"); docWriter = new StreamWriter(filename, false, ec); docWriter.Write(encoding.GetString(flieByte)); docWriter.Close(); } }
/// <summary> /// 获取文件的编码格式 /// </summary> public class EncodingType { /// <summary> /// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型 /// </summary> /// <param name=“FILE_NAME“>文件路径</param> /// <returns>文件的编码类型</returns> public static System.Text.Encoding GetType(string FILE_NAME ,List<string> ResultList) { FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read); Encoding r = GetType(fs, FILE_NAME, ResultList); fs.Close(); return r; } /// <summary> /// 通过给定的文件流,判断文件的编码类型 /// </summary> /// <param name=“fs“>文件流</param> /// <returns>文件的编码类型</returns> public static System.Text.Encoding GetType(FileStream fs, string FILE_NAME , List<string> ResultList) { //byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; //byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; //byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM Encoding reVal = Encoding.Default; BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default); int i; int.TryParse(fs.Length.ToString(), out i); byte[] ss = r.ReadBytes(i); if (IsUTF8Bytes(ss, FILE_NAME, ResultList) || (ss.Length > 3 && ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)) { reVal = Encoding.UTF8; } else if (ss.Length > 3 && ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00) { reVal = Encoding.BigEndianUnicode; } else if (ss.Length>3 && ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41) { reVal = Encoding.Unicode; } r.Close(); return reVal; } /// <summary> /// 判断是否是不带 BOM 的 UTF8 格式 /// </summary> /// <param name=“data“></param> /// <returns></returns> private static bool IsUTF8Bytes(byte[] data, string FILE_NAME, List<string> ResultList) { int charByteCounter = 1; //计算当前正分析的字符应还有的字节数 byte curByte; //当前分析的字节. for (int i = 0; i < data.Length; i++) { curByte = data[i]; if (charByteCounter == 1) { if (curByte >= 0x80) { //判断当前 while (((curByte <<= 1) & 0x80) != 0) { charByteCounter++; } //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X if (charByteCounter == 1 || charByteCounter > 6) { return false; } } } else { //若是UTF-8 此时第一位必须为1 if ((curByte & 0xC0) != 0x80) { return false; } charByteCounter--; } } if (charByteCounter > 1) { ResultList.Add($"{FILE_NAME},异常:非预期的byte格式,无法判断是否是UTF8(不带BOM)格式,已跳过"); //throw new Exception("非预期的byte格式"); } return true; } }
1 0
- C#检查目录下所有文件的编码格式并转换为UTF8格式
- Unity项目脚本编码格式转换为UTF8编码格式
- C++ 保存文件为UTF8编码格式
- CSV文件保存为utf8编码格式
- 将utf8等编码格式转换为shift_jis格式
- 将utf8等编码格式转换为shift_jis格式
- linux 下的文件编码格式转换
- ubantu下修改mysql默认编码格式为utf8编码
- PHP读取目录下所有文件,并通过ajax返回json格式的数据
- ubuntu下进行文件编码转换(如将文件转为UTF8格式)
- 将编码格式为utf8转换为GBK的一个脚本
- 修改Eclipse所有文件的编码格式为UTF-8
- VS新建立文件设定编码为utf8格式
- 递归提取目录下的所有json格式的文件,重命名,并保存到另外的目录
- 检查文件编码是什么格式的
- 保存文件为utf8格式。
- mysql中批量修改所有数据表的格式为utf8
- vs中cpp文件编码格式为utf8,注释有汉字,编译不通过的问题
- 页面 滑动到顶部或者底部
- Linux sysctl 命令
- iOS Block使用注意
- JavaCC -- 中文字符解析失败(c++版)
- linux shell基础七之判断
- C#检查目录下所有文件的编码格式并转换为UTF8格式
- 使用Maven搭建SpringMVC
- 如何使用HTML5自定义数据属性
- 什么是maven?(eclipse)
- oracle 分析函数
- python文件读取
- 一、Oracle分析函数入门
- 分段和分页
- Struts2入门初步需掌握