我在UAC中使用Windows 64位,需要检查Windows系统文件夹中是否存在文件,而不提升权限。已经在过去6小时内寻找解决方案,但没有成功...... :(
根据这个问题FileExists() returns false, even if file exists,我可以使用Wow64DisableWow64FsRedirection(),但我在很多其他地方看到它不推荐。
现在我正在尝试使用特殊的" Sysnative"别名,但在使用FileExists功能时,它不起作用(例如:如果fileexists(' C:\ Windows \ Sysnative \ dfrgui.exe')则...)
拜托,有人可以帮我吗?也许是汇编(Asm)解决方案?
谢谢!
答案 0 :(得分:6)
Sysnative应该有效并且是最合适的解决方案。
来自MSDN:
32位应用程序可以访问本机系统目录 将%windir%\ Sysnative替换为%windir%\ System32。 WOW64 将Sysnative识别为用于指示该文件的特殊别名 系统不应重定向访问。这种机制很灵活 因此,它是推荐的绕过文件的机制 系统重定向。请注意,64位应用程序无法使用 Sysnative别名,因为它是一个虚拟目录而不是真正的目录。
小型演示(Delphi XE - W7 x64):
program SO22990909;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
STR_SYSNATIVEPATH = 'c:\windows\sysnative\';
STR_SYSTEM32PATH = 'c:\windows\system32\';
STR_DETECTFILE = 'wups2.dll';
procedure CheckFile(Filename : String);
begin
if FileExists(Filename) then
Writeln(Format('file %s found', [Filename]))
else
Writeln(Format('file %s not found', [Filename]));
end;
begin
try
CheckFile(STR_SYSTEM32PATH+STR_DETECTFILE);
CheckFile(STR_SYSNATIVEPATH+STR_DETECTFILE);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
ReadLn;
end.
程序输出(文件仅存在于c:\ windows \ system32中):
文件dfrgui.exe(文件存在于c:\ windows \ system32和c:\ windows \ syswow64中):
答案 1 :(得分:1)
根据您的文件
的评论c:\windows\syswow64\test\file.dll
这是在32位系统目录中。用
测试它的存在FileExists('c:\windows\system32\test\file.dll')
仔细阅读MSDN documentation on WOW64 file system redirection,您将受益匪浅。