看起来,我想用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位。
以前是否有人遇到过此类案件? 有什么建议吗?
提前谢谢!答案 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');