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 方法无法正确访问文件,因此在处理文件路径时需要注意。

posted @ 2023-03-11 20:20  dongzhaosheng73  阅读(1086)  评论(1编辑  收藏  举报