我得到一个或多或少看起来像这样的字符串:
"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字符,它也会成为有效的路径?
答案 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字符的文件夹并复制另一个。
噢......太尴尬了。