Pergunta

Eu quero escrever algumas estatísticas para um arquivo de texto a cada vez que uma pessoa carrega uma página. Mas de vez em quando eu estou chegando 'Não foi possível abrir arquivo, já em uso' tipo de erro. Eu não posso 100% replicar esse erro é muito errático. Meu código é

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

A minha pergunta é, como posso bloquear e desbloquear o arquivo assim que eu parar de receber os erros erráticos?

Graças

Foi útil?

Solução

Você terá que lidar com a exceção e construir algum tratamento à escrita re-try para o arquivo depois de um curto intervalo aleatório.

Se você ficar muito grande combate, então ele pode fazer mais sentido para registrá-lo em uma tabela em um banco de dados e criar um processo para exportar para um arquivo (se o seu ainda necessário)

Outras dicas

Se dois ou mais pedidos de acertar o seu servidor web mais ou menos ao mesmo tempo, todos eles vão tentar abrir o mesmo arquivo. Você vai precisar para criar nomes de arquivo exclusivo para cada solicitação.

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

Três coisas importantes aqui:

  1. Use of IO.FileShare.ReadWrite para permitir que vários escritores sobre o arquivo ao mesmo tempo.
  2. A declaração Usando para garantir que o fluxo está fechado imediatamente, mesmo se ocorrer uma exceção. Isso irá minimizar colisões
  3. O TextWriterTraceListener irá criar um arquivo temporário para o seu caso não pode abrir o arquivo que você solicitar, para garantir que a mensagem não está perdido.

Eu não tive nenhum problema com a informação curta usando: File.AppendAllText (caminho, info);

Quanto ao comentário sobre ele causando bloqueios, de refletor ele usa as mesmas opções muito bem explicado por Joel. Ele não usa o escritor traço, por isso não vai saída para um arquivo temporário no caso de alto teor de carga / grande causando problemas.

Se a informação for grande, você realmente quer arquivos separados. Em alta de carga, eu iria com a sugestão de Joel e criar um arquivo temporário, que pode ser alternativamente feito por captura a exceção em File.AppendAllText, e usando o mesmo File.AppeandAllText com um nome único.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top