File.Exists产生false,但文件存在

时间:2013-09-04 11:02:27

标签: c#

我在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)-Folder。而且当然,7ZIP安装在C:\ Program Files(x86)\ 7-ZIP \ 7z.exe中,当调用CreateProcess时,一切正常。所有Exists() - Checks失败的原因是什么?这是一个已知的错误吗?

2 个答案:

答案 0 :(得分:2)

我会说Dukeling的评论是正确的

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

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

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

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

答案 1 :(得分: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字符串:

config

现在的路径为:

  

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