小哈龙 沙滩

版权声明:需要转载的请注明出处 https://blog.csdn.net/qq_22642239/article/details/78687086
在写c#代码的时候,遇到一个问题,在使用File.ReadAllText()打开文本文件的时候,调试发现打开的文本是乱码,我生成的这个文本文件是在c++程序下,以多字节格式生成的,然后保存的一个文本,c# 使用File.ReadAllText()读取这个文本的时候没有指定字符集。

解决方法:

1.使用File.ReadAllText()读取文件:

File.ReadAllText(strfilename,System.Text.Encoding.Default) //在后面加上默认字符集,strfilename指的是文件的路径加名称(包括后缀名)

2.使用FileStream和 StreamReader

FileStream fs = new FileStream(strfilename, FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs, Encoding.Default); //在后面加上默认字符集

下面是我实际项目中的实际代码:

功能就是为了实现打开并识别两种字符集(unicode和多字节)的文本,然后根据判断文本的内容,进行其他操作

  // 获取测试结果
                    if (File.Exists(ti.Path + "\\TestResult.txt"))//更改字符集不同的读取的乱码,导致测试结果无法读取的问题,
                    {
                        string data_back = File.ReadAllText(ti.Path + "\\TestResult.txt");   //读取UNICODE文本,如果文本是多字节则出现乱码——sxl
                        string path = ti.Path + "\\TestResult.txt";
                        FileStream fs = new FileStream(path, FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
                        StreamReader sr = new StreamReader(fs, Encoding.Default);         //用于支持读取多字节文本,防止乱码--sxl
                        string data = sr.ReadLine();
                        if (!string.IsNullOrEmpty(data) && (data.Contains("测试成功") || data_back.Contains("测试成功")))   //上面通过两种方式读取文本文件,如果不为空并且任何一种方式读取到测试结果文本,则测试成功--sxl
                        {
                            ti.Result = (int)TestResult.Success;
                            dgvTestPrograms.Rows[i].Cells["Result"].Value = "测试成功";
                            dgvTestPrograms.Rows[i].DefaultCellStyle.BackColor = Color.Green;
                        }
                        else
                        {
                            ti.Result = (int)TestResult.Fail;
                            dgvTestPrograms.Rows[i].Cells["Result"].Value = "测试失败";
                            dgvTestPrograms.Rows[i].DefaultCellStyle.BackColor = Color.Red;
                        }
                        fs.Close();//  new的对象没有关闭导致测试结果文本被进程占用,无法上传的问题
                        sr.Close();
                    }