如何修改C#代码检测指定目录下.sql文件编码并输出到控制台?
修改C#代码检测SQL文件编码并处理
问题修正与代码实现
原代码存在逻辑错误(错误遍历文件路径字符串的字符),同时未处理编码检测。以下是修改后的完整代码,实现批量检测.sql文件编码(UTF-8/UTF-16)、控制台输出编码信息,并保留原文件编码进行内容修改:
using System; using System.IO; using System.Text; class SqlFileProcessor { static void Main() { // 目标SQL文件所在目录 string directoryPath = @"E:\src_Vemala\Nautilus\Product\dev\Database\Nautilus\Scripts"; // 获取目录下所有.sql文件 string[] sqlFiles = Directory.GetFiles(directoryPath, "*.sql"); foreach (string sqlFile in sqlFiles) { // 检测当前文件编码 Encoding fileEncoding = DetectSqlFileEncoding(sqlFile); // 控制台打印编码信息 Console.WriteLine($"文件: {Path.GetFileName(sqlFile)},编码类型: {fileEncoding.EncodingName}"); // 以检测到的编码读取文件内容 string[] readText = File.ReadAllLines(sqlFile, fileEncoding); // 以原编码写入修改后的内容(覆盖原文件) using (StreamWriter sw = new StreamWriter(sqlFile, false, fileEncoding)) { foreach (string s in readText) { // 执行你的替换逻辑 sw.WriteLine(ReplaceView(s)); } } } } // 检测SQL文件编码(仅针对UTF-8/UTF-16) private static Encoding DetectSqlFileEncoding(string filePath) { using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { byte[] buffer = new byte[4]; int readBytes = fs.Read(buffer, 0, 4); // 检测UTF-16字节序标记(BOM) if (readBytes >= 2) { // UTF-16大端序(BE) if (buffer[0] == 0xFE && buffer[1] == 0xFF) return Encoding.BigEndianUnicode; // UTF-16小端序(LE) if (buffer[0] == 0xFF && buffer[1] == 0xFE) return Encoding.Unicode; } // 检测UTF-8字节序标记(BOM) if (readBytes >= 3) { if (buffer[0] == 0xEF && buffer[1] == 0xBB && buffer[2] == 0xBF) return Encoding.UTF8; } // 无BOM的情况,按需求默认判定为UTF-8(若需更严谨可扩展逻辑) return Encoding.UTF8; } } // 你的原有替换方法,保持不变 private static string ReplaceView(string input) { // 这里是你的替换逻辑实现 // 示例:return input.Replace("oldText", "newText"); return input; } }
关键说明
- 编码检测逻辑:通过读取文件开头的字节序标记(BOM)判断编码,UTF-16分为大端/小端两种,UTF-8可能带BOM;无BOM的文件按需求默认判定为UTF-8。
- 文件读写:读取和写入时都使用检测到的编码,避免乱码或修改原文件编码。
- 批量处理:通过
Directory.GetFiles获取目录下所有.sql文件,实现批量处理。
内容的提问来源于stack exchange,提问作者Vemala Valas
相关产品推荐
相关产品推荐

