4

似乎,我想用 FileExists() 检查的一些文件即使在那里也永远找不到,而其他文件每次都能找到。

如果我将文件“driver.sys”放入“C:\Windows\System32\drivers\”目录中,将永远找不到(每次调用该函数时 FileExists 都是错误的)。如果我将文件移动到 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 位。

有没有人经历过这样的案例?有什么建议么?

提前谢谢!

4

1 回答 1

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');

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');
于 2012-12-06T20:34:45.040 回答