Mit Problem Öffnen / Schreiben in eine Textdatei in ASP.NET
-
11-07-2019 - |
Frage
Ich mag einige Statistiken in eine Textdatei eine Person jedes Mal schreiben, eine Seite lädt. Aber jeder einmal in eine Weile ich bin immer ‚Datei konnte nicht geöffnet, bereits in Verwendung‘ Art des Fehlers. Ich kann nicht zu 100% replizieren diese Fehler es ist sehr unberechenbar. Mein Code ist
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
Meine Frage ist, wie kann ich die Datei sperren und entsperren, damit ich die erratische Fehler stoppen bekommen?
Danke
Lösung
Du musst die Ausnahme behandeln und einige Handhabung baut erneut versuchen, nach einem kurzen zufälligen Intervall in die Datei zu schreiben.
Wenn Sie zu viel Konkurrenz bekommen, dann könnte es sinnvoller, es melden sich an einem Tisch in einer Datenbank machen und einen Prozess erstellen, um eine Datei zu exportieren (wenn seine nach wie vor erforderlich)
Andere Tipps
Wenn zwei oder mehr Anfragen treffen Ihre Webserver in etwa zur gleichen Zeit, werden sie alle versuchen, die gleiche Datei zu öffnen. Sie müssen für jede Anforderung eindeutige Dateinamen erstellen.
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
Drei wichtige Dinge hier:
- Die Verwendung von IO.FileShare.ReadWrite zu auf einmal mehr Autoren, die über die Datei nicht gestattet.
- Die Anweisung um sicherzustellen, dass der Strom sofort geschlossen wird, auch wenn eine Ausnahme auftritt. Dies minimiert Kollisionen
- Die Textwritertracelistener wird eine temporäre Datei für Ihre erstellen, wenn die Datei nicht öffnen können Sie, fordern die Nachricht, um sicherzustellen, nicht verloren geht.
Ich habe keine Probleme mit Kurzinfo mit hatte: File.AppendAllText (path, info);
In Bezug auf den Kommentar auf sie verursacht Schlösser, aus Reflektor es den gleichen Optionen verwendet von Joel sehr gut erklärt. Es verwendet nicht das Trace-Writer, so wird es nicht Ausgabe in eine temporären Datei im Fall hoher Last / hohe Gehalt Probleme verursacht.
Wenn die Info groß ist, wollen Sie wirklich separate Dateien. Für hohe Belastung, würde ich mit Joel Vorschlag gehen und eine temporäre Datei erstellen, die alternativ durch den Fang die Ausnahme auf File.AppendAllText getan werden kann, und den gleichen File.AppeandAllText mit einem eindeutigen Dateinamen verwendet wird.