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

C#导入文件为数组时ReadAllLines报非法字符错误怎么解决

问题根因

  • 你构造gold1变量的逻辑错误:C#代码书写时用到的@前缀、包裹字符串的双引号是语法标识,仅在编写代码字面量时生效,不能直接拼接成字符串传给文件操作API。
  • 拼接后的路径里包含了@和双引号字符,属于Windows文件路径不允许的非法字符,所以ReadAllLines直接抛出非法字符错误。
  • OpenFileDialog返回的FileName属性本身就是合法的可用路径,不需要额外做任何格式化拼接。

修正后的代码

{
    OpenFileDialog fdlg = new OpenFileDialog();
    fdlg.Title = "C# Corner Open File Dialog";
    fdlg.InitialDirectory = @"c:\";
    fdlg.Filter = "文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*";
    fdlg.FilterIndex = 1;
    fdlg.RestoreDirectory = true;

    if (fdlg.ShowDialog() == DialogResult.OK)
    {
        textBox2.Text = fdlg.FileName;
        // 直接用FileName,不需要拼接任何额外字符
        string[] lines = System.IO.File.ReadAllLines(fdlg.FileName, System.Text.Encoding.UTF8);
        
        // 后续处理逻辑
        foreach (var line in lines)
        {
            Console.WriteLine(line);
        }
    }
}

双文件内容校验实现逻辑

  1. 用同样的方式读取第二个文件的所有行存入数组
  2. 为提升校验效率,把第二个数组转为HashSet<string>,可根据需求选择是否忽略大小写、忽略空行、忽略行首尾空白
  3. 遍历第一个文件的所有行,判断是否全部存在于HashSet中,示例代码:
// 读取两个文件内容
string[] list1 = File.ReadAllLines(第一个文件路径, Encoding.UTF8);
string[] list2 = File.ReadAllLines(第二个文件路径, Encoding.UTF8);

// 示例配置:忽略行首尾空白、忽略大小写校验
var checkSet = new HashSet<string>(list2.Select(x => x.Trim()), StringComparer.OrdinalIgnoreCase);
bool allExist = list1.All(line => checkSet.Contains(line.Trim()));

if (allExist)
{
    // 第一个列表所有内容都在第二个列表中的处理逻辑
}
else
{
    // 存在缺失内容的处理逻辑,可通过下方代码获取缺失的行
    var missingItems = list1.Where(line => !checkSet.Contains(line.Trim())).ToList();
}

内容的提问来源于stack exchange,提问作者jimc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:45:03