2009-03-12 4 views
3

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

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 

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

Благодаря

ответ

1

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

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

+0

Мне иногда приходится писать в файл до 20 раз на странице, насколько большой размер будет иметь место в базе данных? – pixeldev

4

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

+0

На самом деле: каждая сессия, вероятно, достаточно хороша. Маловероятно, что один пользователь сможет создавать много одновременных запросов. –

0

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

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

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

+0

Он все еще может заблокировать: я видел его. –

+0

вы уверены, что это на производстве, а не на одной записи в журнале для этого ... как я уже сказал, небольшие фрагменты информации – eglasius

+0

@Joel Я подтвердил, что он использует соответствующие опции с отражателем, вы имеете в виду, что ваше решение также блокируется? (не думаю, что, поскольку я не сказал никаких записей в журнале) – eglasius

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 

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

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

Joel, не нужно идти с пользовательским решением, когда простой File.AppendAllText делает именно это (с рефлектором) – eglasius

+0

Мне нужно это сделать, но, как я сказал выше, я вижу, что File.AppendAllText получает блокировку. –

+0

Тогда ваше решение также делает, я думаю, нам нужно альтернативное решение, тогда/мое дело в том, что он был не мал информации, которая даст проблемы с загрузкой, независимо от подхода – eglasius

Смежные вопросы