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); } } }
双文件内容校验实现逻辑
- 用同样的方式读取第二个文件的所有行存入数组
- 为提升校验效率,把第二个数组转为
HashSet<string>,可根据需求选择是否忽略大小写、忽略空行、忽略行首尾空白 - 遍历第一个文件的所有行,判断是否全部存在于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
相关产品推荐
相关产品推荐

