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

时间:2009-08-19 06:36:39

标签: c# unicode path fileinfo

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

"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 :(得分:1)

这是一种处理文件名中的变音符号的方法。 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 :(得分:0)

试试这个

    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。

答案 2 :(得分: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#语法的工件,你想要制作确保您的字符串实际上只包含单个\

答案 3 :(得分:0)

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

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

或者您可能不是在问这个问题,而且您真的想要找到一个名称为

的文件
c:\blòh\bleh

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

噢......太尴尬了。