2009-05-26 12 views
7

プロセスが強化されており、パスがVSデバッガで正しいことを確認しました(Environment.GetFolderPath(Environment.SpecialFolder.System)を使用していますが、ハードコーディングではありません)が、File.Existsはfalseを返します。.NET File.ExistsはWindows System32 Driversフォルダでは機能しませんか?

私が必要とするのは、アンインストール時にレジストリ設定が削除されないため、サードパーティのドライバがインストールされていることを保証するための回避策です。

私は書き込みが仮想化によってリダイレクトされることは知っていますが、これはファイルの存在をチェックするためにも当てはまりますか?

+0

私にとってうまく動作します。あなたの環境は何ですか? – Noldorin

答えて

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);    
    } 
} 

更新: XP(私は信じて前SP2)以前のバージョンは、これらのメソッドを公開していないので、あなたはまた、WOWリダイレクトを無効にする前に、OSのバージョンを確認する必要があるかもしれません。

更新2: 64ビットのOSチェックが追加されました。 OSのすべての64ビットバージョンがこれらの方法を実装しているため、64ビットOS上で実行している場合にのみ、その状態を無効にする必要があります。

+0

それでは、try/finallyではOSのバージョンを確認する必要がありますか?私はfinallyブロックがサポートされていなければ投げてしまうだろうと思います。 – Davy8

+0

はい - finallyブロックは依然としてWow64XXXメソッドを呼び出します。 –

2

プロセスは32ビットまたは64ビットですか?ドライバ64または32ですか?私は、あなたのホストOSがあなたをWow64フォルダにリダイレクトするかもしれないということになっています。

0

これは仮想化の問題です。ファイルは存在しません。仮想化されたファイルが格納されているフォルダで探す必要があります。

0

あなたが権利を持っている場合、コード内の同じ場所にファイルを作成しようとしないと、どこが終わるのか確認してください。別の方法で示唆されているように、Windowsはいくつかの設定に基づいて呼び出しをリダイレクトしている可能性があります。

また、DirectoryInfoを実行して、それが含んでいるファイルを列挙して、よく見えるかどうかを調べることができます。

2

あなたのアプリにdisabling folder virtualizationを試しましたか?あなたがrequest admin abilityする必要がありますそれらのフォルダに書き込みをする必要がある場合は、しかし、

<?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> 

:あなたは含むマニフェストファイルを追加必要があります。これを行うには、xmlのlevel="asInvoker"level="requireAdministrator"に変更します。