代码之家  ›  专栏  ›  技术社区  ›  pixeldev

在ASP.NET中打开/写入文本文件时遇到问题。网

  •  3
  • pixeldev  · 技术社区  · 17 年前

    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 回复  |  直到 17 年前
        1
  •  4
  •   Jakob Christensen    17 年前

    如果两个或多个请求大致同时访问您的web服务器,它们都会尝试打开同一个文件。您需要为每个请求创建唯一的文件名。

        2
  •  4
  •   Joel Coehoorn    17 年前
    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无法打开您请求的文件,它将为您创建一个临时文件,以确保消息不会丢失。
        3
  •  1
  •   Nick Kavadias    17 年前

        4
  •  0
  •   eglasius    17 年前

    文件。AppendAllText(路径、信息);

    如果信息量很大,你真的需要单独的文件。对于高负载,我会按照Joel的建议创建一个临时文件,也可以通过捕获file上的异常来完成。AppendAllText,并使用相同的文件。使用唯一文件名的AppeandAllText。