是的,虛擬化發生在非常低的水平。 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