2011-08-04 14 views
7

私はファイルが存在すると確信していますが、驚くようなFileNotFoundExceptionを取得しています。IO.FileNotFoundExceptionが存在しますが、ファイルが存在する必要があります

ログファイル(IO.FileInfo)を添付ファイルとして電子メールに追加するだけで、すべてのファイルの長さを確認して、追加/圧縮が必要かどうかを検出しようとしました。 これらのファイルが既に存在する場合、これはうまく動作します。 しかし、私はこの実行でそれらを作成した場合、私は長さをチェックしようとすると例外を超えて取得します。奇妙なことに、私はこれらの「存在しない」ファイル(実際にはFileInfo.Existsfalseを返す)に1行前に問題なく書き込むことができます。ここで

Logという名前のクラスのコンストラクタ内のファイルのいずれかを作成しています...いくつかのコードです:

Me.LogFile = New IO.FileInfo(infoLogPath) 
If Not LogFile.Exists() Then 
    'tried to use `Using` on the Stream but that doesn't change anything' 
    Using stream = Me.LogFile.Create() 
     'close and dispose implicitely 
    End Using 
End If 

私は問題なくファイルに書き込むことができます。

Me.Log.WriteInfo("BlahBlahBlah...", False) 

例外が発生してから1行後LogFile.Length

If Me.Log.LogFile.Length <> 0 Then 
    files.Add(Me.Log.LogFile) 
End If 

Me.Logは、FileInfoオブジェクトへの参照を保持するLogというカスタムロギングクラスオブジェクトです。

これはLogFileIO.FileInfo -onjectで、クラスLogWriteInfoです:Refresh

Public Sub WriteInfo(ByVal message As String, ByVal finishLog As Boolean) 
    Try 
     Using w As IO.StreamWriter = Me.LogFile.AppendText 
      If Me.WithTimestamp Then 
       w.WriteLine(Date.Now.ToString(Globalization.CultureInfo.InvariantCulture) & ": " & message) 
      Else 
       w.WriteLine(message) 
      End If 
      If finishLog Then w.WriteLine("__________________________") 
      w.Flush() 
      w.Close() 
     End Using 
    Catch writeLogException As Exception 
     Try 
      WriteError(writeLogException, True) 
     Catch innerEx As Exception 
      'ignore 
     End Try 
    End Try 
End Sub 

実は@ShellShocks solutionは簡単でした。ファイルを更新しないときにFileNotFoundExceptionが発生するという不思議なことに、この関数を聞いたことはありません。

Me.Log.LogFile.Refresh() 
+1

Dはドライブまたは物理ドライブにマップされていますか? – kleinohad

+0

これはどのようなアプリですか?Windowsサービスですか? ASP.NET? – Yahia

+0

'D'は物理ドライブです。このコードはWin2008サーバでも、開発用PC(Win XP)でも動作しません。どちらもこの物理的なドライブを持っています。これはWindowsサービスとなりますが、これまでのテスト目的では、スタートボタンのみを持つWinFormアプリケーションです。 –

答えて

6

FileInfo.Exists前FileInfo.Refreshを呼び出してみるか、FileInfo.Length - 更新は最新の値を取得しますので、これらのプロパティは、キャッシュされる場合があります。

+0

FileInfo.Exists(ファイルの作成場所)では例外が発生しませんが、FileInfo.Lengthでは例外ですが、 'Length'より前の' Refresh'は実際に例外を回避しますが、なぜですか?どうもありがとうございました :) –

関連する問題