System.IO.File.Exists(string path)
指定されたパスにファイルが存在する場合でも、常にfalseを返します。可能な解決策は何ですか?
許可の問題である可能性があります。 ドキュメント から:
指定されたファイルが存在するかどうかを判断しようとしてエラーが発生した場合、Existsメソッドはfalseを返します。これは、無効な文字または文字が多すぎるファイル名を渡す、ディスクの障害または欠落などの例外を発生させる状況、または呼び出し元にファイルの読み取り権限がない場合に発生する可能性があります。
何が起こっているかを確認する1つの方法は、ファイルを読み取ろうとすることです(例:File.OpenRead
)。それが成功した場合-びっくりしますが、失敗した場合は、例外が詳細情報を提供するはずです。
Windowsでファイルの末尾を非表示にすると、混乱が生じる場合があります。実際のファイル名がfile.txt.txtであるにもかかわらず、最後の4文字がOSによって非表示になっているため、ファイルの名前がfile.txtであることがわかります。
ここでの回答のいずれにも言及されていない可能性の1つは、Windows 8.1以降での 'File System Redirection'です。
たとえば、プログラムが32ビットアプリケーションで、64ビットWindowsで実行している場合、%windir%\ System32にアクセスしようとすると、%windir%\ SysWOW64にリダイレクトされます。アクセスしようとしているファイルが%windir%\ SysWOW64に存在しない場合、System.IO.File.Exists(string path)はFalseを返します。
これを回避する方法は、Server.MapPath(fileName)
を使用していたため、別の場所でファイルを見つけようとしていました。
System.IO.File.Exists(Server.MapPath(string path))
私の場合、ファイル名の異なる「ダッシュ」が問題の原因です。
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
同じ「-」を使用すると、問題が修正されます。
これについても困惑していましたが、Directory.Existsを使用すべきだったときにFile.Existsを使用していたことに気付きました。
私自身もこれを経験していました。私の場合、ファイルを削除して再作成していました。ファイルを削除していたプロセスで、後で_File.Exists
_を使用する前にWaitForExit()
を追加するのを忘れました
これにより、サービスをローカルでデバッグしている間にしばらく困惑し、ワークステーションで(U :)としてマップされたサーバーの場所に対してFile.Exists( "U:\ dir1")を実行していました。 U:\ dir1を「\\ serverPath\dir1」に置き換え、File.Existsがtrueを返しました。
System.IO.File.Exists(string path)は、C:\OpenSSL\bin\file.txt
を読み取ろうとしたときにfalseを返しました。管理者モードでアプリケーションを実行しても役に立ちませんでした。 (Windows 10の管理者アカウントでログオンしていました)ファイルをC:\Users\MyUser\Desktop\file.txt
に移動すると、File.Exists()はtrueを返しました。