2011-08-04 12 views
7

Me sorprende FileNotFoundException aunque estoy seguro de que el archivo existe.IO.FileNotFoundException pero el archivo debería existir

Simplemente quería agregar archivos de registro (IO.FileInfo) como archivos adjuntos a un correo electrónico, por lo tanto, traté de verificar la longitud de cada archivo para detectar si se deben agregar/comprimir. Esto funciona bien si estos archivos ya existen. Pero si los he creado en esta ejecución, obtengo una excepción cuando trato de verificar la longitud. Curiosamente, puedo escribir en estos archivos "no existentes" (en realidad, FileInfo.Exists devuelve false) sin problema alguna línea anterior.

Aquí hay un código ...

Creación de uno de los archivos en el constructor de una clase llamada 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 

Puedo escribir en el archivo sin ningún problema:

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

Una línea después de obtener la excepción en LogFile.Length:

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

Me.Log es un objeto de clase de registro personalizado denominado Log que contiene la referencia al objeto FileInfo.

Ésta es WriteInfo en clase Log, LogFile es el IO.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 

En realidad @ShellShocks solution con Refresh era simple. Nunca he oído hablar de esta función, es extraño que obtenga una excepción FileNotFoundException cuando no actualizo el archivo.

Me.Log.LogFile.Refresh() 
+1

¿D es la unidad asignada o la unidad física? – kleinohad

+0

¿Qué tipo de aplicación es esta - Servicio de Windows? ASP.NET? – Yahia

+0

'D' es una unidad física, este código no funciona en un servidor Win2008 ni en mi pc de desarrollo (Win XP). Ambos tienen este impulso físico. Este será un servicio de Windows, pero hasta ahora, con fines de prueba, es una aplicación de WinForm con solo un botón de inicio. –

Respuesta

6

Intente llamar FileInfo.Refresh antes FileInfo.Exists o FileInfo.Length - estas propiedades se pueden almacenar en caché, por lo Refresh obtendrá el último valor.

+0

La excepción no ocurrirá en FileInfo.Exists (donde creo el archivo) pero en FileInfo.Length, pero 'Refresh' before' Length' realmente evita la excepción, pero ¿por qué? Muchas gracias :) –

Cuestiones relacionadas