0

我在 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\"";

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

4

2 回答 2

2

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

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

正在寻找以 C:\ 之前的双引号开头的路径,因为现在不能命名的人说在字符串之前使用“@”,因此它变为:

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

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

于 2013-09-04T11:20:00.843 回答
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

于 2013-09-04T11:20:14.960 回答