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

pia*_*imo 4 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;
Run Code Online (Sandbox Code Playgroud)

这有效(当文件位于'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;
Run Code Online (Sandbox Code Playgroud)

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

以前有人经历过这样的案子吗?有什么建议?

Thx提前!

TLa*_*ama 8

您的System32目录将映射到SysNative路径File System Redirector,因为您可以看到,这样的目录路径的硬编码并不那么容易.更好地使用下面列出的内置常量之一:

1. {sys}常量:

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

{sys}常量参考:

系统的System32目录.例如:如果您在条目上使用了{sys}\CTL3D32.DLL且系统的Windows系统目录是"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');
Run Code Online (Sandbox Code Playgroud)

2. {syswow64}常量:

{syswow64}常量参考:

在64位Windows上,系统的SysWOW64目录,通常为"C:\ WINDOWS\SysWOW64".这是32位系统文件所在的实际目录.在32位Windows上,32位系统文件驻留在"System32"或"System"中,而不是位于单独的SysWOW64目录中,因此如果在此处使用,此常量将解析为与{sys}相同的目录.

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

以下是如何使用它:

if FileExists(ExpandConstant('{syswow64}\drivers\driver.sys')) then
  Log('File exists');
Run Code Online (Sandbox Code Playgroud)