2011-08-04 33 views
7

Tôi nhận được một bất ngờ FileNotFoundException mặc dù tôi chắc chắn rằng tệp tồn tại.IO.FileNotFoundException nhưng Tệp phải tồn tại

Tôi chỉ muốn thêm Logfiles (IO.FileInfo) dưới dạng tệp đính kèm vào email, do đó tôi đã cố kiểm tra độ dài của mỗi tệp để phát hiện xem chúng có phải được thêm/nén hay không. Tính năng này hoạt động tốt nếu các tệp này đã tồn tại. Nhưng nếu tôi đã tạo chúng trong lần chạy này, tôi sẽ vượt qua ngoại lệ khi tôi cố gắng kiểm tra độ dài. Đó là kỳ lạ, đủ để tôi có thể viết vào những tập tin "không tồn tại" (thực tế FileInfo.Exists trả về false) mà không có một vấn đề trước khi một dòng.

Dưới đây là một số mã ...

Tạo một trong những tập tin trong constructor của một lớp có tên 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 

tôi có thể viết vào tập tin mà không có một vấn đề:

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

Một dòng sau khi tôi nhận được ngoại lệ trên LogFile.Length:

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

Me.Log là đối tượng lớp ghi nhật ký tùy chỉnh có tên Log chứa tham chiếu đến đối tượng FileInfo.

Đây là WriteInfo trong lớp 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 

Trên thực tế @ShellShocks solution với Refresh rất đơn giản. Không bao giờ nghe nói về chức năng này, lạ mà tôi nhận được một FileNotFoundException khi tôi không làm mới các tập tin.

Me.Log.LogFile.Refresh() 
+1

D có phải là ổ đĩa được ánh xạ hoặc ổ đĩa vật lý không? – kleinohad

+0

loại ứng dụng này là gì - Dịch vụ Windows? ASP.NET? – Yahia

+0

'D' là một ổ đĩa vật lý, mã này không hoạt động trên máy chủ Win2008 cũng như trên máy tính phát triển của tôi (Win XP). Cả hai đều có ổ đĩa vật lý này. Đây sẽ là một Windows-Service nhưng cho đến nay cho mục đích thử nghiệm đó là một WinForm-App chỉ với một nút khởi động. –

Trả lời

6

Thử gọi FileInfo.Refresh trước FileInfo.Exists, hoặc FileInfo.Length - các đặc tính này có thể được lưu trữ, vì vậy Refresh sẽ nhận được giá trị mới nhất.

+0

Ngoại lệ sẽ không xảy ra trên FileInfo.Exists (nơi tôi tạo tệp) nhưng trên FileInfo.Length, nhưng 'Refresh' trước' Length' thực sự tránh ngoại lệ, nhưng tại sao? Cảm ơn nhiều :) –

Các vấn đề liên quan