该过程已提升,并且我确保 VS 调试器中的路径是正确的(我使用 Environment.GetFolderPath(Environment.SpecialFolder.System) 而不是对其进行硬编码),但 File.Exists 仍然返回 false。
我需要这个的原因是确保安装一些第三方驱动程序的解决方法,因为它们的注册表设置在卸载时不会被删除。
我知道写入是通过虚拟化重定向的,但是检查文件是否存在也是如此吗?
是的,虚拟化发生在非常低的水平。 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 );
}
}
Update:您可能还需要在禁用 WOW 重定向之前检查操作系统版本,因为早期版本的 XP(我认为是 SP2 之前的版本)不会公开这些方法。
更新2:添加了 64 位操作系统检查。所有 64 位版本的操作系统都实现了这些方法,如果在 64 位操作系统上运行,您只需禁用 sate。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)