Возникли проблемы с открытием / записью в текстовый файл в ASP.NET - PullRequest
3 голосов
/ 12 марта 2009

Я хочу записывать статистику в текстовый файл каждый раз, когда человек загружает страницу. Но время от времени я получаю сообщение об ошибке «Не удалось открыть файл, уже используется». Я не могу на 100% повторить эту ошибку, она очень ошибочна. Мой код

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

У меня вопрос, как я могу заблокировать и разблокировать файл, чтобы перестать получать ошибочные ошибки?

Спасибо

Ответы [ 4 ]

4 голосов
/ 12 марта 2009
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

Три важные вещи здесь:

  1. Использование IO.FileShare.ReadWrite, чтобы разрешить одновременную запись нескольких файлов в файл.
  2. Оператор Using, обеспечивающий немедленное закрытие потока, даже если возникает исключение. Это сведет к минимуму столкновения
  3. TextWriterTraceListener создаст временный файл для вас, если он не может открыть файл, который вы запрашиваете, чтобы убедиться, что сообщение не потеряно.
4 голосов
/ 12 марта 2009

Если два или более запросов попадают на ваш веб-сервер примерно в одно и то же время, они все попытаются открыть один и тот же файл. Вам нужно будет создавать уникальные имена файлов для каждого запроса.

1 голос
/ 12 марта 2009

Вам придется обработать исключение и создать некоторую обработку, чтобы повторить попытку записи в файл после короткого случайного интервала.

Если вы получаете слишком много разногласий, то может иметь смысл записать его в таблицу в базе данных и создать процесс для экспорта в файл (если он все еще необходим)

0 голосов
/ 12 марта 2009

У меня не было проблем с краткой информацией, используя: File.AppendAllText (путь, информация);

Что касается комментария о том, что он вызывает блокировки, то в отражателе он использует те же параметры, которые очень хорошо объяснил Джоэл. Он не использует средство записи трассировки, поэтому он не будет выводить во временный файл в случае высокой нагрузки / большого содержимого, вызывающего проблемы.

Если информация большая, вам действительно нужны отдельные файлы. Для высокой нагрузки я бы воспользовался предложением Джоэла и создал временный файл, который можно альтернативно сделать, перехватив исключение в File.AppendAllText и используя тот же File.AppeandAllText с уникальным именем файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...