投稿

11月, 2018の投稿を表示しています

FileInfo.Existsがファイルがあるのにfalseを返す?

FileInfoを使って、次のような処理をするとfalseが返ってくる事があります。(後述する理由で逆にファイルがないのにtrueが返ってくるケースもあると思う)
var file = new FileInfo("C:\MyDoc\Hoge.txt");
     // なにか別の時間の掛かる処理
if (file.Exists) // これがfalseになる。
{
     // ファイルを開いて処理を行う
}
else
{
     // エラー処理
}
ちゃんと動きそうですが、これでfalseが返ってくるケースがあります。ググってみると、同じようなケースと対策が見つかりました。FileInfo.Exists Returns False after file is copied
FileInfoはインスタンスが作成されたタイミングで取得したファイル情報を持っているようです。確かに思い当たる節はあって、時間の掛かる処理を行っている間にデータファイル(Hoge.txt)を用意してた。つまりファイルのない状態でFileInfoのインスタンスを作って、後からファイルを用意していた訳ですね。
対策はすごく簡単。Existsの前でRefreshを呼んで最新情報に更新すればOK.
var file = new FileInfo("C:MyDocHoge.txt");
    // なにか別の時間の掛かる処理
file.Refresh(); //最新情報に更新する
if (file.Exists) // こんどはOK
{
    // ファイルを開いて処理を行う
}
else
{
    // エラー処理
}