我在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失败的原因是什么?这是一个已知的错误吗?
答案 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
字符串:
现在的路径为:
C:\ Program Files \ 7-Zip \ 7z.exe