文件夹枚举无法识别指定文件的代码Bug求助
问题排查与修复:无法识别文件路径并赋值给
compare_conv_filepath 问题根源
原代码的核心错误是:Directory.EnumerateFiles(folder)返回的是包含完整路径的字符串(例如D:\target\1.xlsx),而你用file.Equals("1.xlsx")直接将完整路径和纯文件名做相等比较,永远无法匹配到目标文件,自然无法进入foreach循环完成赋值。另外,代码里引入的using System.IO.Enumeration;是多余的,Directory类属于System.IO命名空间。
修复方案
以下两种简洁方案都能解决问题,按需选择:
方式一:提取文件名后匹配
通过Path.GetFileName()获取每个文件的纯文件名,再和目标名称做比较:
using System.IO; // 查找目标文件,最多返回一个结果 var convFile = Directory.EnumerateFiles(folder) .FirstOrDefault(file => Path.GetFileName(file).Equals("1.xlsx", StringComparison.OrdinalIgnoreCase)); // 直接赋值,不存在文件则为null compare_conv_filepath = convFile; // 存在文件时输出对比信息 if (compare_conv_filepath != null) { Console.WriteLine(compare_conv_filepath); Console.WriteLine($"--> Comparing to: {compare_org_filepath}"); }
方式二:使用搜索模式重载
利用Directory.EnumerateFiles的重载方法,直接指定搜索文件名,效率更高:
using System.IO; // 直接搜索文件夹中名为1.xlsx的文件 var convFile = Directory.EnumerateFiles(folder, "1.xlsx").FirstOrDefault(); compare_conv_filepath = convFile; if (compare_conv_filepath != null) { Console.WriteLine(compare_conv_filepath); Console.WriteLine($"--> Comparing to: {compare_org_filepath}"); }
关键说明
- 两种方式都用
FirstOrDefault()替代了foreach循环,因为需求明确最多只有一个目标文件,无需遍历全部结果;不存在文件时会返回null,完全符合需求。 - 方式一中的
StringComparison.OrdinalIgnoreCase是为了兼容大小写差异(比如系统中存在1.XLSX的情况),如果需要严格区分大小写,可以移除该参数。 - 移除了多余的
using System.IO.Enumeration;引用,简化代码结构。
内容的提问来源于stack exchange,提问作者Asbjoedt
相关产品推荐
相关产品推荐

