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 字符,它也会成为有效路径?

4

6 回答 6

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;
}
于 2012-09-20T15:45:11.153 回答
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。

于 2009-08-19T07:00:05.523 回答
0

我刚刚手动创建了一个 bláh 文件夹,其中包含一个 bleh 文件,并且有了它,此代码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 .

于 2009-08-19T07:01:43.227 回答
0

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

看起来您真正要问的问题是“如何从字符串(或在本例中为文件路径)中删除变音符号?”。

或者你可能没有问这个问题,你真的想找到一个文件名:

c:\blòh\bleh

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

于 2009-08-19T07:05:52.407 回答
0

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

于 2009-08-19T07:14:15.337 回答
0

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

哦……好尴尬。

于 2009-08-20T09:02:35.893 回答