是的,虚拟化发生在非常低的水平。 File.Exists方法基本上调用Win32的CreateFile方法并检查错误。 CreateFile被WOW子系统重定向。
在调用之前,您可以临时禁用虚拟化。
[DllImport("kernel32", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr oldValue);
[DllImport("kernel32", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern bool Wow64RevertWow64FsRedirection(IntPtr oldValue);
当然要完成,你必须检查文件的存在与虚拟化以及关闭。这同样适用于检查注册表项。
public static bool FileExists(string path)
{
if(File.Exists(path)) return true;
IntPtr oldValue = IntPtr.Zero;
try
{
if(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432") == null)
return false;
Wow64DisableWow64FsRedirection(ref oldValue);
if(File.Exists(path)) return true;
return false;
}
finally
{
if(oldValue != IntPtr.Zero)
Wow64RevertWow64FsRedirection(ref oldValue);
}
}
更新:您可能还需要禁用WOW重定向之前检查OS版本,因为早期版本的XP(SP2之前的我相信)不公开这些方法。
更新2:增加了64位的操作系统检查。所有64位版本的操作系统都实现这些方法,并且只需要在64位操作系统上运行即可禁用状态。
适合我。你的环境是什么? – Noldorin 2009-05-26 21:04:15