You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:05:33