Aquí podría ser tu PUBLICIDAD


Tener problemas para abrir / escribir en un archivo de texto en ASP.NET

votos
3

Quiero escribir algunas estadísticas en un archivo de texto cada vez que una persona carga una página. Pero de vez en cuando recibo el tipo de error No se puede abrir el archivo, ya está en uso. No puedo replicar al 100% este error, es muy errático. Mi código es

Public Sub WriteStats(ByVal ad_id As Integer)
    Dim ad_date As String = Now.Year & Now.Month

    Dim FILENAME As String = Server.MapPath(text/BoxedAds.txt)
    Dim objStreamWriter As StreamWriter
    objStreamWriter = File.AppendText(FILENAME)
    objStreamWriter.WriteLine(ad_id & ; & ad_date)
    objStreamWriter.Close()
End Sub

Mi pregunta es, ¿cómo puedo bloquear y desbloquear el archivo para que deje de obtener los errores erráticos?

Gracias

Publicado el 12/03/2009 a las 17:21
fuente por usuario pixeldev
En otros idiomas...        العربية       

4 respuestas

votos
4
Public Sub WriteStats(ByVal ad_id As Integer)
    Dim ad_date As String = Now.Year & Now.Month
    Dim FILENAME As String = Server.MapPath("text/BoxedAds.txt")
    Dim index As Integer

    Using fs As New IO.FileStream(FILENAME, IO.FileMode.Append, IO.FileAccess.Write, IO.FileShare.ReadWrite), _
          tl As New TextWriterTraceListener(fs)

        index = Trace.Listeners.Add(tl)
        Trace.WriteLine(ad_id & ";" & ad_date)
        Trace.Listeners(index).Flush()
        Trace.Flush()
    End Using
    Trace.Listeners.RemoveAt(index)
End Sub

Tres cosas importantes aquí:

  1. Uso de IO.FileShare.ReadWrite para permitir múltiples escritores en el archivo a la vez.
  2. La instrucción Using para asegurarse de que la transmisión se cierre inmediatamente, incluso si se produce una excepción. Esto minimizará las colisiones
  3. El TextWriterTraceListener creará un archivo temporal para usted si no puede abrir el archivo que solicita, para asegurarse de que el mensaje no se pierda.
Respondida el 12/03/2009 a las 05:31
fuente por usuario Joel Coehoorn


Aquí podría ser tu PUBLICIDAD


votos
4

Si dos o más solicitudes llegan a su servidor web más o menos al mismo tiempo, todas intentarán abrir el mismo archivo. Tendrá que crear nombres de archivo únicos para cada solicitud.

Respondida el 12/03/2009 a las 05:23
fuente por usuario Jakob Christensen

votos
1

Deberá manejar la excepción y generar algún control para volver a intentar escribir en el archivo después de un breve intervalo aleatorio.

Si obtiene demasiada contención, entonces podría tener más sentido registrarla en una tabla en una base de datos y crear un proceso para exportarla a un archivo (si aún es necesario).

Respondida el 12/03/2009 a las 05:28
fuente por usuario Nick Kavadias

votos
0

No he tenido ningún problema con información breve usando: File.AppendAllText (ruta, información);

En cuanto al comentario que causa bloqueos, desde el reflector utiliza las mismas opciones explicadas muy bien por Joel. No utiliza la herramienta de escritura de trazas, por lo que no generará un archivo temporal en el caso de una carga alta o un contenido grande que cause problemas.

Si la información es grande, realmente quieres archivos separados. Para la carga alta, me gustaría ir con la sugerencia de Joel y crear un archivo temporal, que alternativamente se puede hacer mediante la captura de la excepción en File.AppendAllText, y utilizando el mismo File.AppeandAllText con un nombre de archivo único.

Respondida el 12/03/2009 a las 05:29
fuente por usuario eglasius