【问题标题】:File.Exists yields false, but the file existsFile.Exists 产生错误,但文件存在
【发布时间】:2013-09-07 20:30:42
【问题描述】:

我在 C# 中使用 File.Exists 时遇到了一个奇怪的问题,可以在多台 PC 上重现。我认为这是 .NET 4 库中的错误。

我使用 7ZIP 并从 C# 程序自动执行它,我调用 CreateProcess 并用它压缩和解压缩文件。为此,我需要找出是否安装了 7ZIP 以及安装在何处,因为我不想依赖 PATH 变量。

所以这是代码的一部分:

if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\7-Zip\\7z.exe"))
    clsGlobal.gstr_ZIP_PROG_MIT_PFAD = "\"" + Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\7-Zip\\7z.exe\"";

else if (File.Exists("\"C:\\Program Files (x86)\\7-Zip\\7z.exe\""))
    clsGlobal.gstr_ZIP_PROG_MIT_PFAD = "\"C:\\Program Files (x86)\\7-Zip\\7z.exe\"";

所有存在检查都给我“假”回。 ProgramFiles-SpecialFolder 肯定指向正确的 (x86) 文件夹。而且可以肯定的是,7ZIP 安装在 C:\Program Files (x86)\7-ZIP\7z.exe 中,调用 CreateProcess 时,一切正常。所有 Exists() - 检查失败的原因是什么?这是一个已知的错误吗?

【问题讨论】:

标签: c#


【解决方案1】:

我会说杜克林在他的评论中是正确的

"\"C:\\Program Files (x86)\\7-Zip\\7z.exe\""

正在寻找以 C:\ 之前的双引号开头的路径 就像现在不能被命名的人所说的那样,在字符串之前使用“@”,这样它就变成了:

@"C:\Program Files (x86)\7-Zip\7z.exe\"

这使代码具有可读性,并且还可以防止与引号混淆,这似乎是这里发生的事情。

【讨论】:

    【解决方案2】:

    我认为这是 .NET 4 库中的错误。

    这不是 .NET Framework 中的错误...

    打印路径值。

    会是:

    C:\Program Files (x86)\7-Zip\7z.exe

    默认情况下,我相信7-Zip 安装到Program Files 而不是Program Files (x86)

    您正在使用:

    Environment.SpecialFolder.ProgramFiles
    

    如果您的代码是针对 x86 构建的(我怀疑是这样),那么这个枚举将为您提供:

    程序文件 (x86)

    System.EnvironmentSpecialFolder

    程序文件目录。在非 x86 系统上,将 ProgramFiles 传递给 GetFolderPath 方法会返回非 x86 程序的路径。要在非 x86 系统上获取 x86 程序文件目录,请使用 ProgramFilesX86 成员。

    这不是7-Zip 安装到的文件夹。

    如果您将代码更改为:

    if (File.Exists(@"C:\Program Files\7-Zip\7z.sfx"))
    

    你应该没事的

    或者,目标x64 并且枚举将返回Program Files 字符串:

    路径现在变为:

    C:\Program Files\7-Zip\7z.exe

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      相关资源
      最近更新 更多