C# 播放文件名中包含多个连续空格的文件
在代码的某些部分,我检查文件是否存在,然后打开它 一名员工遇到包含多个空格字符的文件名问题 我查过了,这是真的。以下是我的代码片段:C# 播放文件名中包含多个连续空格的文件,c#,.net,C#,.net,在代码的某些部分,我检查文件是否存在,然后打开它 一名员工遇到包含多个空格字符的文件名问题 我查过了,这是真的。以下是我的代码片段: string filePath = Path.Combine(helper.MillTestReportPath, fileName); // Ouverture du fichier if (File.Exists(filePath)) { Process.Start(filePath); } else { MessageBox.Show("L
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);
}
几乎每一个文件都能正常工作,但当一个文件(例如“垃圾邮件证书S O 94318099P O 10610.msg”)包含多个空格时,我会对该文件设置为false。存在,即使我直接尝试运行该进程。启动它失败
你知道我该怎么解决吗
非常感谢 空格的数量应该不是问题。是否检查了filePath的输出字符串?我相信这是不对的。正如Henk所建议的,如果输出不正确,请尝试更改为Path.Combine()
Bonne journée使用您指定的相同文件名运行此测试代码:
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中看到的失败是什么?使用该文件路径尝试此操作时会发生什么情况:
try {
string path = Path.Combine(helper.MillTestReportPath, fileName);
using (FileStream fs = File.Open(path, FileMode.CreateNew)) {
}
} catch (IOException ex) {
// any exception here?
}
根据,File.Exists
返回:
如果调用方具有所需的权限且路径包含现有文件的名称,则为true;否则,错误。如果路径为null、无效路径或长度为零的字符串,此方法也会返回false。如果调用方没有足够的权限读取指定的文件,则不会引发异常,并且无论路径是否存在,该方法都返回false
如果该文件存在,则可能试图访问该文件的用户没有必要的权限。我想其他人已经介绍了我要检查的与文件相关的内容,但是您是否考虑过检查字符串与本地文件系统中的本地化/编码
看来你在用德语?在您的消息框提示中,可能正在将苹果与桔子进行比较。。。只是想一想。嘿。请以编程方式列出父目录。然后对每个子文件逐字符回显所有文件名。最好使用十六进制或unicode代码 您可能在文件名的某个地方有一些不常见的空白字符。尤其是如果文件名是从某个密钥库或xml文件自动生成的。我怀疑您的文件名不仅包含ANSI空格字符
(char)32
0020hex,还包含其他与空格字符无法区分的ANSI字符
如果文件位于NTFS驱动器上,则文件名甚至可以包含Unicode字符
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。一个建议是,优先选择
Path.Combine()
而不是String.Concat()
。这是另一回事,现在尝试使用进程打开my file with spaces.txt
。启动,效果很好。调试并检查filePath
变量的值。@Shadow:我说的是多个空格。只有一个空格的文件就可以了。@Tom文件名my file with spaces.txt
包含三个空格。如果你不相信我,请随意数一数。@Shadow:我的意思是:一行三个空格不在总文件名中。。。谢谢你的回答,我改成了路径。联合收割机仍然不工作。输出字符串没有问题,我想:“R:\\Nesting\\Mill Test Report\\SPAM CERTS S S O 94414834 P O 11304.msg”你觉得怎么样?我建议使用@“yourpath”而不是转义字符,这样更安全,会给你更多chances@Tom调试时复制确切路径,并尝试直接从Windows资源管理器浏览到该路径-您可以通过这种方式访问该文件吗?carmbrester的评论与此有关,评论被隐藏,只是注意到了它,因此如果正确,他们应该得到信任:)