首页 文章

带有非ascii字符的文件路径和C#中的FileInfo

提问于
浏览
2

我得到一个或多或少看起来像这样的字符串:

"C:\\bláh\\bleh"

我用它制作一个FileInfo,但是当我检查它的存在时它返回false:

var file = new FileInfo(path);
file.Exists;

如果我手动将路径重命名为

"C:\\blah\\bleh"

在调试时并确保blah存在于其中的bleh,然后file.Exists开始返回true . 所以我认为问题是非ascii角色 .

实际的字符串是由我的程序构建的 . 一部分来自应用程序的AppDomain,它是包含“á”的部分,另一部分来自用户 . 这两个部分由Path.Combine组合在一起 . 我以两种方式确认了结果字符串的有效性:将其从我的程序生成的错误(包括路径)中复制到资源管理器中打开文件就好了 . 在调试器中查看该字符串,它看起来正确转义,其中\被写为\ . “á”由调试器文字打印 .

我应该如何处理一个字符串,即使它有非ascii字符,它结果是一个有效的路径?

6 回答

  • 0

    这是一种处理文件名中的变音符号的方法 . File.Exists方法的成功取决于系统如何存储文件名 .

    public bool FileExists(string sPath)
    {
      //Checking for composed and decomposed is to handle diacritics in filenames.  
      var pathComposed = sPath.Normalize(NormalizationForm.FormC);
      if (File.Exists(pathComposed))    
          return true;
    
       //We really need to check both possibilities.
       var pathDecomposed = sPath.Normalize(NormalizationForm.FormD);
       if (File.Exists(pathDecomposed))     
          return true;
    
       return false;
    }
    
  • 1

    试试这个

    string sourceFile = @"C:\bláh\bleh";
        if (File.Exists(sourceFile))
        {
    
             Console.WriteLine("file exist.");
    
        }
        else
        {
            Console.WriteLine("file does not exist.");
    
        }
    

    注意:Exists方法不应用于路径验证,此方法仅检查路径中指定的文件是否存在 . 将无效路径传递给Exists将返回false .

    对于路径验证,您可以使用Directory.Exists .

  • 0

    我刚刚manuall创建了一个包含bleh文件的bláh文件夹,并且在此处,此代码按预期打印 True

    using System;
    using System.IO;
    
    namespace ConsoleApplication72
    {
        class Program
        {
            static void Main(string[] args)
            {
                string filename = "c:\\bláh\\bleh";
    
                FileInfo fi = new FileInfo(filename);
    
                Console.WriteLine(fi.Exists);
    
                Console.ReadLine();
            }
        }
    }
    

    我建议检查你的字符串的来源 - 特别是,虽然你的3k代表反对这是问题,但请记住,表示反斜杠为 \\ 是C#语法的工件,并且你想确保你的字符串实际上只包含单个 \ s .

  • 0

    参考@adatapost的回复,无效文件名字符列表(从 System.IO.Path.GetInvalidFileNameChars() 收集到的字母实际上不包含带有变音符号的普通字符 .

    看起来你真正问的问题是“How do I remove diacritics from a string(或者在这种情况下,文件路径)?” .

    或许你不是在问这个问题,而你真的想要找到一个名字的文件:

    c:\blòh\bleh
    

    (或类似的东西) . 在这种情况下,您需要尝试打开具有相同名称的文件,而不是 c:\bloh\bleh .

  • 0

    看起来路径中的“bleh”是目录,而不是文件 . 要检查文件夹是否存在,请使用Directory.Exists方法 .

  • 0

    问题是:程序没有足够的权限来访问该文件 . 修复权限修复了问题 . 似乎当我没有进行实验时,我设法重现了权限问题,可能是通过手工创建没有非ascii字符的文件夹并复制另一个 .

    哦......太尴尬了 .

相关问题