InnoSetup(Pascal):FileExists()找不到每个文件

时间:2012-12-06 18:26:43

标签: inno-setup

看起来,我想用FileExists()查看的一些文件,即使它们在那里也找不到,每次都会找到其他文件。

如果我将文件“driver.sys”放入“C:\ Windows \ System32 \ drivers \”目录中,则永远不会找到它(每次调用该函数时FileExists都为false)。 如果我将文件移动到Windows根目录“C:\ Windows \”,则会找到它。

这不起作用(当文件肯定在文件夹'C:\ Windows \ System32 \ drivers \'中)时:

function isNotDriverInstalled(): Boolean;
begin
  if (FileExists('C:\Windows\System32\drivers\driver.sys')) then begin
    Log('File exists');
    Result := False;
  end else begin
    Log('File doesn''t exist');
    Result := True;
  end;
end;

这有效(当文件位于文件夹'C:\ Windows \'中)时:

function isNotDriverInstalled(): Boolean;
begin
  if (FileExists('C:\Windows\driver.sys')) then begin
    Log('File exists');
    Result := False;
  end else begin
    Log('File doesn''t exist');
    Result := True;
  end;
end;

顺便说一句:我使用的是Windows 7,64位。

以前是否有人遇到过此类案件? 有什么建议吗?

提前谢谢!

1 个答案:

答案 0 :(得分:8)

由于File System Redirector,您的System32目录已映射到SysNative路径,因此您可以看到,此类目录路径的硬编码并不那么容易。最好使用下面列出的一个内置常量:

1。 {sys}常量:

您可以使用{sys}常量,但请确保允许设置以64位模式运行。有关如何执行此操作的详细信息,请参阅ArchitecturesInstallIn64BitMode指令参考,并务必阅读64-bit Installation Limitations主题。

来自{sys}常量参考:

  

系统的System32目录。例如:如果你使用过   条目和系统的Windows系统上的{sys} \ CTL3D32.DLL   目录是“C:\ WINDOWS \ SYSTEM”,安装程序或卸载将翻译它   到“C:\ WINDOWS \ SYSTEM \ CTL3D32.DLL”。

     

在64位Windows上,默认情况下,由此返回System32路径   只是常量映射到包含32位系统文件的目录   喜欢在32位Windows上。 (这可以通过启用64位来覆盖   模式。)

以下是如何使用它:

if FileExists(ExpandConstant('{sys}\drivers\driver.sys')) then
  Log('File exists');

2。 {syswow64}常量:

来自{syswow64}常量参考:

  

在64位Windows上,通常是系统的SysWOW64目录   “C:\ WINDOWS \ SysWOW64中”。这是32位的实际目录   系统文件驻留。在32位Windows上,32位系统文件驻留在   “System32”或“System”,不在单独的SysWOW64目录中,所以这个   如果在那里使用,则常量将解析到与{sys}相同的目录。

     

除非您特别需要获取,否则请勿使用此常量   32位系统文件所在的实际目录的名称。   无条件地在{sys}足够的地方使用{syswow64}   引起问题。 (请参阅[文件]部分的文档   一个例子的sharedfile标志。)

以下是如何使用它:

if FileExists(ExpandConstant('{syswow64}\drivers\driver.sys')) then
  Log('File exists');