在我的代码的某些部分,我检查文件是否存在,然后打开它。
一名员工遇到包含多个空格字符的文件名问题。
我查了一下,这是真的。这是我的代码片段:
string filePath = Path.Combine(helper.MillTestReportPath, fileName);
// Ouverture du fichier
if (File.Exists(filePath))
{
Process.Start(filePath);
}
else
{
MessageBox.Show("Le fichier n'existe pas!", "Fichier introuvable", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
几乎每个文件都可以找到所有内容但是当一个文件(例如“SPAM CERTS SO 94318099 PO 10610.msg”)包含多个空格时,File.Exists会出错,即使我直接尝试运行Process.Start失败......
关于我如何解决这个问题的任何想法?
非常感谢!
答案 0 :(得分:5)
根据MSDN documentation,File.Exists
返回:
如果调用者具有所需权限并且path包含现有文件的名称,则为true;否则为false。否则,错误。如果path为null,无效路径或零长度字符串,则此方法也返回false。如果调用者没有足够的权限来读取指定的文件,则不会抛出任何异常,并且无论路径是否存在,该方法都会返回false。
如果文件存在,那么尝试访问该文件的用户可能没有必要的权限。
答案 1 :(得分:2)
我怀疑你的文件名不仅包含ANSI空格字符(char)32
0020hex,还包含其他与空格字符无法区分的ANSI字符。
如果您的文件驻留在NTFS驱动器上,文件名甚至可以包含Unicode字符。
我编写了一个小型PowerShell脚本,以十六进制显示当前文件夹的文件名
dir | % {
$chars = $_.Name.ToCharArray(); """$($_.Name)""";
$result = "|";
foreach ($char in $chars) {
$result += [String]::Format(" {0} |",$char)
};
"$result";
$result = "|"
foreach ($char in $chars) {
$hexChar = [System.Convert]::ToInt32($char);
$result += $hexChar.ToString("x4");
$result += "|";
};
"$result`r`n";
}
典型输出
"1000 €.txt"
| 1 | 0 | 0 | 0 | | € | . | t | x | t |
|0031|0030|0030|0030|0020|20ac|002e|0074|0078|0074|
"A normal file.txt"
| A | | n | o | r | m | a | l | | f | i | l | e | . | t | x | t |
|0041|0020|006e|006f|0072|006d|0061|006c|0020|0066|0069|006c|0065|002e|0074|0078|0074|
"what the ңёςк.txt"
| w | h | a | t | | t | h | e | | ң | ё | ς | к | . | t | x | t |
|0077|0068|0061|0074|0020|0074|0068|0065|0020|04a3|0451|03c2|043a|002e|0074|0078|0074|
etc.
您可以在此处看到真正的ANSI空格为0020hex。
答案 2 :(得分:0)
空格的数量应该不是问题。你检查了filePath的输出字符串吗?我相信这不对。正如Henk建议的那样,如果输出不正确,请尝试更改为Path.Combine()。
Bonnejournée
答案 3 :(得分:0)
使用您指定的相同文件名运行此测试代码:
const string path = @"C:\TEMP\SPAM CERTS S O 94318099 P O 10610.msg";
if (File.Exists(path)) {
Trace.WriteLine("EXIST");
Process.Start(path);
}
else {
Trace.WriteLine("NOT EXIST");
}
即使有多个顺序空格等,也能正确找到该文件。它还成功启动了相关程序(在我的例子中是Noteapad ++)。
我怀疑,正如其他人指出的那样,你的问题在其他地方。您在Process.Start中遇到的失败是什么?
答案 4 :(得分:0)
使用该文件路径尝试此操作时会发生什么:
try {
string path = Path.Combine(helper.MillTestReportPath, fileName);
using (FileStream fs = File.Open(path, FileMode.CreateNew)) {
}
} catch (IOException ex) {
// any exception here?
}
答案 5 :(得分:0)
我认为其他人已经介绍了我要检查的文件相关内容,但您是否考虑过检查字符串与本地文件系统中的本地化/编码?
看来你正在使用?德语?在你的消息框提示中,可能会将苹果与橙子进行比较......只是一个想法。
答案 6 :(得分:0)
嘿。请以编程方式列出父目录。然后为每个子文件回显所有文件名char-by-char。最好是十六进制或unicode代码。
你可能在文件名的某处有一些非平凡的空白字符。特别是如果文件名是从某个keystore或xml文件自动生成的。