使用文件名中包含多个连续空格的文件

时间:2011-02-18 15:33:31

标签: c# .net

在我的代码的某些部分,我检查文件是否存在,然后打开它。

一名员工遇到包含多个空格字符的文件名问题。

我查了一下,这是真的。这是我的代码片段:

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失败......

关于我如何解决这个问题的任何想法?

非常感谢!

7 个答案:

答案 0 :(得分:5)

根据MSDN documentationFile.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文件自动生成的。