.NET File.Exists在Windows \ System32 \ Drivers文件夹中不起作用?

时间:2009-05-26 20:57:19

标签: .net windows-vista 64-bit drivers

进程升级,我确保VS调试器中的路径是正确的(我使用的是Environment.GetFolderPath(Environment.SpecialFolder.System)而不是硬编码)但File.Exists仍然返回false。

我需要这个的原因是确保安装了一些第三方驱动程序,因为卸载时不会删除它们的注册表设置。

我知道写入是通过虚拟化重定向的,但这对于检查文件的存在也是如此吗?

5 个答案:

答案 0 :(得分:10)

是的,虚拟化发生在非常低​​的水平。 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重定向之前检查操作系统版本,因为早期版本的XP(我认为是Pre SP2)不会公开这些方法。

更新2:为64位添加了OS检查。所有64位版本的操作系统都实现了这些方法,如果在64位操作系统上运行,则只需要禁用状态。

答案 1 :(得分:2)

您的进程是32位还是64位?是64或32的驱动程序?我得到的是,主管OS可能会将您重定向到Wow64文件夹。

答案 2 :(得分:2)

您是否为自己的应用尝试了disabling folder virtualization?您需要添加包含以下内容的清单文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

但是,如果您需要写入这些文件夹,则必须request admin ability。为此,请在xml中将level="asInvoker"更改为level="requireAdministrator"

答案 3 :(得分:0)

这是一个虚拟化问题 - 文件不存在。您必须在包含虚拟化文件的文件夹中查找它。

答案 4 :(得分:0)

如果您拥有这些权利,为什么不尝试在代码中的相同位置创建文件,并查看它的最终位置?正如另一个人所建议的那样,Windows可能会根据一些设置重定向您的呼叫。

此外,您可以尝试执行DirectoryInfo并枚举它包含的文件,以查看是否有任何看起来很熟悉。