Domanda

Voglio scrivere alcune statistiche in un file di testo ogni volta che una persona carica una pagina. Ma ogni tanto vengo al tipo di errore "Impossibile aprire il file, già in uso". Non riesco a replicare al 100% questo errore, è molto irregolare. Il mio codice è

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

La mia domanda è: come posso bloccare e sbloccare il file in modo da smettere di ottenere errori irregolari?

Grazie

È stato utile?

Soluzione

Dovrai gestire l'eccezione e creare un po 'di gestione per riprovare a scrivere sul file dopo un breve intervallo casuale.

Se si ottiene troppa contesa, potrebbe essere più logico registrarlo in una tabella in un database e creare un processo da esportare in un file (se è ancora necessario)

Altri suggerimenti

Se due o più richieste arrivano al tuo server all'incirca nello stesso momento, proveranno tutti ad aprire lo stesso file. Dovrai creare nomi file univoci per ogni richiesta.

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

Tre cose importanti qui:

  1. Uso di IO.FileShare.ReadWrite per consentire a più writer sul file contemporaneamente.
  2. L'istruzione Using per assicurarsi che il flusso venga chiuso immediatamente, anche se si verifica un'eccezione. Ciò ridurrà al minimo le collisioni
  3. TextWriterTraceListener creerà un file temporaneo se non è possibile aprire il file richiesto, per assicurarsi che il messaggio non venga perso.

Non ho avuto problemi con informazioni brevi usando: File.AppendAllText (percorso, informazioni);

Per quanto riguarda il commento che provoca blocchi, dal riflettore usa le stesse opzioni spiegate molto bene da Joel. Non utilizza il writer di traccia, quindi non verrà emesso in un file temporaneo in caso di carico elevato / contenuto di grandi dimensioni che causa problemi.

Se le informazioni sono grandi, vuoi davvero file separati. Per un carico elevato, vorrei seguire il suggerimento di Joel e creare un file temporaneo, che può essere fatto alternativamente rilevando l'eccezione su File.AppendAllText e utilizzando lo stesso File.AppeandAllText con un nome file univoco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top