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字符

我编写了一个小的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。

一个建议是,优先选择
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的评论与此有关,评论被隐藏,只是注意到了它,因此如果正确,他们应该得到信任:)