Dot-Net

IO.FileNotFoundException 但文件應該存在

  • June 23, 2014

FileNotFoundException儘管我確定該文件存在,但我感到很驚訝。

我只是想將 Logfiles( IO.FileInfo) 作為附件添加到電子郵件中,因此我嘗試檢查每個文件的長度以檢測是否必須添加/壓縮它們。 如果這些文件已經存在,這可以正常工作。但是如果我在這次執行中創建了它們,當我嘗試檢查長度時我會遇到異常。奇怪的是,我可以在前一行毫無問題地寫入這些“不存在”的文件(實際上FileInfo.Exists返回)。false

這是一些程式碼…

在名為 的類的建構子中創建文件之一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)

在我得到異常之後的一行LogFile.Length

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

Me.Log是一個名為的自定義日誌記錄類對象Log,它保存對該FileInfo對象的引用。

這是WriteInfo在課堂Log上,LogFileIO.FileInfo-onject:

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

實際上 ,帶有Refresh的@ShellShocks 解決方案很簡單。從來沒有聽說過這個功能,奇怪的是當我不刷新文件時我得到一個 FileNotFoundException 。

Me.Log.LogFile.Refresh()

嘗試在 FileInfo.Exists 或 FileInfo.Length 之前呼叫FileInfo.Refresh——這些屬性可能被記憶體,因此 Refresh 將獲取最新值。

引用自:https://stackoverflow.com/questions/6939893