2012-07-02 245 views
7

¿Hay algún método para verificar que un archivo esté abierto? Lo único en lo que puedo pensar es en el Try/Catch para ver si puedo detectar la excepción de apertura de archivo, pero calculé que hay un método disponible para devolver verdadero/falso si el archivo está abierto.VB.NET ¿Verifica si un archivo está abierto antes de continuar con una lectura/escritura?

Actualmente usando System.IO y el siguiente código en la clase llamada Wallet.

Private holdPath As String = "defaultLog.txt" 
    Private _file As New FileStream(holdPath, FileMode.OpenOrCreate, FileAccess.ReadWrite) 
    Private file As New StreamWriter(_file) 

    Public Function Check(ByVal CheckNumber As Integer, ByVal CheckAmount As Decimal) As Decimal 
     Try 
      file.WriteLine("testing") 
      file.Close() 
     Catch e As IOException 
      'Note sure if this is the proper way. 
     End Try 

     Return 0D 
    End Function 

¡Todos los indicadores serán apreciados! ¡¡Gracias!!

+0

¿Lidiar con File.GetLastAccessTime() quizás? –

+1

No hay una forma directa de detectar que se abre un archivo. – coder

+1

Esto es lo que he preguntado http://stackoverflow.com/questions/6706312/how-to-check-if-the-text-file-is-open-and-close-the-text-file y obtuve la respuesta – coder

Respuesta

14
Private Sub IsFileOpen(ByVal file As FileInfo) 
    Dim stream As FileStream = Nothing 
    Try 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None) 
     stream.Close() 
    Catch ex As Exception 

     If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then 
      ' do something here, either close the file if you have a handle, show a msgbox, retry or as a last resort terminate the process - which could cause corruption and lose data 
     End If 
    End Try 
End Sub 

Private Shared Function IsFileLocked(exception As Exception) As Boolean 
    Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1) 
    Return errorCode = 32 OrElse errorCode = 33 
End Function 
+2

Gran solución. Solo agregaría que necesita asegurarse de stream.close() en caso de que no haya una excepción, para que el programa pueda continuar sin problemas. – mlerley

+0

Dice que Marshal no está declarado. –

+2

@CaryBondoc 'Imports System.Runtime.InteropServices;' para solucionar el problema * Marshal no se ha declarado *. ** Consejo: ** 'Marshal' tendrá un pequeño subrayado azul, pase el mouse sobre esto y ¡le dará una pista de lo que está mal! –

1

Parece que las dos sugerencias de este MSDN forum posting implican intentar abrir el archivo.

La primera es similar a lo que está haciendo ahora, y la segunda consiste en usar una función API de Windows (CreateFile) y buscar un identificador no válido que indique que el archivo está en uso. En ambos casos, se basan en una condición de error para determinar si el archivo está abierto o no. En resumen, en mi opinión, el método que está utilizando es correcto, ya que hay no una propiedad System.IO.File.IsOpen.

+1

Hola Mark, estoy seguro de que es habitual en las respuestas de StackOverflow incluir un resumen de los contenidos de un enlace o los aspectos más destacados que responden específicamente a la pregunta. El objetivo de los sitios SE es convertirse en un recurso de conocimiento, de respuestas, en los próximos años. Con una respuesta de solo enlace, el operador debe buscar otro recurso para encontrar una respuesta de la que no esté seguro. Lo que es más importante, si su enlace se rompiera alguna vez, su respuesta es inútil para cualquier persona que visite esta página en el futuro. ¡Saludos por el enlace! –

+1

@JeremyThompson estoy al tanto de eso y lo hago. En este caso, tomé la decisión ** consciente ** de no pegar ningún código. No estaba tratando de sugerir que este era el camino correcto a seguir. Estaba tratando de ** tranquilizar ** al OP que la forma en que lo estaba haciendo era correcta, en mi humilde opinión. Sugerirle que use el WinApi no era lo que estaba tratando de hacer, y en este caso demasiado. –

+1

Gracias Mark, agradezco su respuesta y estoy de acuerdo en que es exagerada, pero me brindó una buena perspectiva sobre el tema. Gracias de nuevo :) – Dayan

5

no hay realmente ningún punto utilizando un 'archivo está en uso cheque' función ya que todavía tendrá que tener intento de captura para manejar el caso de que el archivo no se abre. El archivo abierto puede fallar por muchas más razones de las que ya están abiertas.

Usar también una función para hacer una comprobación no es garantía de éxito. El 'es archivo en uso verificación' puede devolver falso solo para que el archivo abierto falle con un error de archivo ya abierto, porque a tiempo entre el cheque y tratando de abrir el archivo fue abierto por alguien más.

+1

realmente debería ser un comentario en lugar de una respuesta – TruthOf42

Cuestiones relacionadas