2009-05-26 77 views
7

這個過程被提升了,我確保了路徑在VS調試器中是正確的(我使用的是Environment.GetFolderPath(Environment.SpecialFolder.System)而不是硬編碼)但是File.Exists仍然返回false。.NET File.Exists在Windows System32 Drivers文件夾中不起作用?

我需要這個的原因是確保安裝某些第三方驅動程序的解決方法,因爲它們的註冊表設置在卸載時不會被刪除。

我知道寫入是通過虛擬化重定向的,但這對於檢查文件是否存在也是正確的?

+0

適合我。你的環境是什麼? – Noldorin 2009-05-26 21:04:15

回答

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重定向之前檢查OS版本,因爲早期版本的XP(SP2之前的我相信)不公開這些方法。

更新2:增加了64位的操作系統檢查。所有64位版本的操作系統都實現這些方法,並且只需要在64位操作系統上運行即可禁用狀態。

+0

因此,嘗試/最後我還需要檢查操作系統版本?如果它不被支持,我想finally塊也會拋出。 – Davy8 2009-05-27 14:29:57

2

你的進程是32位還是64位?並且是司機64或32?我得到的是,也許你的主機操作系統將你重定向到Wow64文件夾。

0

這是一個虛擬化問題 - 該文件不存在。您將不得不在包含虛擬化文件的文件夾中查找它。

0

如果您有權利,爲什麼不嘗試在代碼中的相同位置創建文件,並查看它結束的位置?正如另一個人所建議的那樣,Windows可能會根據一些設置重定向您的呼叫。

此外,你可以嘗試做一個DirectoryInfo並枚舉它包含的文件,看看是否有什麼看起來很熟悉。

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"

相關問題