web-dev-qa-db-ja.com

C#File.Existsはfalseを返し、ファイルは存在します

VS 15を使用して、.Net 4.5.2でC#
コンピューターはADネットワーク上にあり、広告名は「AD」です。
この問題は、ADの通常ユーザー権限、AD管理者権限、およびローカル管理者権限で発生します。プログラムがどのような権利を取得しても、同じ問題が発生します。

テストファイルは「C:/windows/system32/conhost.exe」です。
上記のファイルが存在し、非常に多く存在しています。エクスプローラーで見ることができます。

これはエクスプローラーのファイルです。
enter image description here

これはファイルプロパティです。
enter image description here

そこにあることがわかりますよね?
次のcmdコマンドは、ファイルが存在するかどうかを確認します。

IF EXIST "C:\windows\system32\conhost.exe" (echo does exist) ELSE (echo doesnt exist)

約束どおり「does exist」を返します。

次のC#コードは、ファイルが存在するかどうかを確認します。

FileInfo file = new FileInfo("C:/windows/system32/conhost.exe");
MessageBox.Show(file.Exists + "");

これは、「False」を返します。

このコードは、「False」も返します。

MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + "");

このコードも見つけられません:

foreach (string file in Directory.GetFiles("C:/windows/system32/"))
{
    //conhost is NEVER mentioned, like it doesn't exist
}

このコードも見つけられません:

foreach (string file in Directory.EnumerateFiles("C:/windows/system32/"))
{
    //conhost is NEVER mentioned, like it doesn't exist
}

False、False、False:

MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + "");
MessageBox.Show(File.Exists("C:\\windows\\system32\\conhost.exe") + "");
MessageBox.Show(File.Exists(@"C:\windows\system32\conhost.exe") + "");

私は何を間違えていますか?
追加メモ:conhostをC:\ conhost.exeにコピーしたので、プログラムで問題なく見つけることができます。私のプログラムは、system32の他のファイルも検索しますが、conhostと他のいくつかのファイルは検索しません。たとえば、system32にある「connect.dll」を検出するため、ディレクトリの読み取り権限ではありません。
その他の注記:conhost.exeとconnect.dllには同じセキュリティ属性があります(ファイルプロパティの[セキュリティ]タブ)。

X64システムを使用している場合、c:\Windows\System32 x86およびx64アプリケーションのディレクトリ。バッチファイルとC#アプリを実行している同じアーキテクチャを使用していることを確認してください。

40

System.IO.File.Exists(path) のMSDNドキュメントには、次のように記載されています。

呼び出し元に指定されたファイルを読み取るための十分なアクセス許可がない場合、例外はスローされず、メソッドはパスの存在に関係なくfalseを返します。

このため、アプリケーションには特定のファイルへの読み取りアクセス権がないと安全に想定できます。セキュリティ設定を確認し、読み取りアクセスを許可します(まだ許可されていない場合)。

アプリケーションを(リリースモードで)ビルドし、管理者として実行します。

10
Nathangrad

これは、64ビットオペレーティングシステムで発生する問題です。回避策は次のとおりです。

プロジェクトのプロパティに移動し、[ビルド]タブをクリックして、[32ビットを優先]を選択解除

その後、64ビットOSで正しく動作するはずです。

0
hsCode