C# File.Exist 返回false 无法正确判断文件是否存在
问题描述:
首先澄清一下File.Exist 并没有问题,为了让更多没有思路的朋友进来看明白什么原因导致这个问题的,我才会起这么一个标题现在我给大家讲一下为何会发生这个问题。
在 Windows 系统中,当文件属性中包含不可视的 Unicode 字符串时,C# File.Exist 方法无法正确识别文件是否存在,这是因为 File.Exist 方法在判断文件是否存在时是通过访问文件的属性来实现的,而如果文件属性中包含不可视的 Unicode 字符串,则会导致 File.Exist 方法无法正确访问文件。
复现方式:
1、文件属性-安全-对象名称 鼠标从前往后复制出来的字符串 和从后往前复制出来的字符串使用md5进行比对即可发现md5值不同。
2、将可以被File.Exist判断存在的文件路径和不能判断存在的文件路径复制到txt文本中,这两个路径肉眼看应该是一致的,然后在文本中将编码调整成ASCII编码你会发现有问题的路径前面会有一个不可识别的unicode字符串它就是罪魁祸首。
解决方法: 可以使用正则表达式过滤掉文件路径中的不可视 Unicode 字符串,以解决该问题。下面是使用 C# 代码实现的方法:
using System.IO; using System.Text.RegularExpressions; public static bool IsFileExist(string filePath) { // 使用正则表达式过滤掉文件路径中的不可视 Unicode 字符串 var filteredPath = Regex.Replace(filePath, @"[\p{C}]", ""); return File.Exists(filteredPath); }
上面的代码中,使用了正则表达式 [\p{C}]
来匹配不可视的 Unicode 字符串,然后使用 Regex.Replace
方法将其过滤掉,得到过滤后的文件路径 filteredPath
。最后,使用 File.Exists
方法判断文件是否存在。
注意事项: 虽然使用正则表达式过滤掉不可视 Unicode 字符串可以解决该问题,但同时也可能导致一些不可预见的问题,因此在实际应用中需要谨慎使用。此外,如果文件路径中包含其他非法字符,也可能会导致 File.Exist 方法无法正确访问文件,因此在处理文件路径时需要注意。