web-dev-qa-db-ja.com

System.IO.File.Exists(string path)がfalseを返すのはなぜですか?

System.IO.File.Exists(string path)

指定されたパスにファイルが存在する場合でも、常にfalseを返します。可能な解決策は何ですか?

26
Shilpa Soni

許可の問題である可能性があります。 ドキュメント から:

指定されたファイルが存在するかどうかを判断しようとしてエラーが発生した場合、Existsメソッドはfalseを返します。これは、無効な文字または文字が多すぎるファイル名を渡す、ディスクの障害または欠落などの例外を発生させる状況、または呼び出し元にファイルの読み取り権限がない場合に発生する可能性があります。

何が起こっているかを確認する1つの方法は、ファイルを読み取ろうとすることです(例:File.OpenRead)。それが成功した​​場合-びっくりしますが、失敗した場合は、例外が詳細情報を提供するはずです。

44
Jon Skeet

Windowsでファイルの末尾を非表示にすると、混乱が生じる場合があります。実際のファイル名がfile.txt.txtであるにもかかわらず、最後の4文字がOSによって非表示になっているため、ファイルの名前がfile.txtであることがわかります。

8
bugmagnet

ここでの回答のいずれにも言及されていない可能性の1つは、Windows 8.1以降での 'File System Redirection'です。

たとえば、プログラムが32ビットアプリケーションで、64ビットWindowsで実行している場合、%windir%\ System32にアクセスしようとすると、%windir%\ SysWOW64にリダイレクトされます。アクセスしようとしているファイルが%windir%\ SysWOW64に存在しない場合、System.IO.File.Exists(string path)はFalseを返します。

この動作を説明する素敵な記事へのリンク

5
NGambit

これを回避する方法は、Server.MapPath(fileName)を使用していたため、別の場所でファイルを見つけようとしていました。

System.IO.File.Exists(Server.MapPath(string path))
5
F U

私の場合、ファイル名の異なる「ダッシュ」が問題の原因です。

var f1 = "4-37R.pdf";
var f2 = "4‐37R.pdf";
var r = f1==f2?"same":"diff";
Console.Write(r); //diff

判明

var c1 = '-';
var c2 = '‐';
Console.WriteLine((int)c1); //45
Console.WriteLine((int)c2); //8208

同じ「-」を使用すると、問題が修正されます。

3
Rm558

これについても困惑していましたが、Directory.Existsを使用すべきだったときにFile.Existsを使用していたことに気付きました。

2
D. Haskins

私自身もこれを経験していました。私の場合、ファイルを削除して再作成していました。ファイルを削除していたプロセスで、後で_File.Exists_を使用する前にWaitForExit()を追加するのを忘れました

1
Krondorian

これにより、サービスをローカルでデバッグしている間にしばらく困惑し、ワークステーションで(U :)としてマップされたサーバーの場所に対してFile.Exists( "U:\ dir1")を実行していました。 U:\ dir1を「\\ serverPath\dir1」に置き換え、File.Existsがtrueを返しました。

1
Ionselat

System.IO.File.Exists(string path)は、C:\OpenSSL\bin\file.txtを読み取ろうとしたときにfalseを返しました。管理者モードでアプリケーションを実行しても役に立ちませんでした。 (Windows 10の管理者アカウントでログオンしていました)ファイルをC:\Users\MyUser\Desktop\file.txtに移動すると、File.Exists()はtrueを返しました。

0
M. Krzyk