在VB.NET中写入文本文件的有效方法

时间:2011-01-24 19:37:21

标签: vb.net file text io file-writing

我们需要将一些信息(大约18 KB)写入存储在我们其中一个网络驱动器上的.txt文件中。该文件大约每15分钟重写一次,但几乎每秒都会读取一次。我们目前正在使用StreamWriter来编写文件。

文件服务器位于远程位置,往返ping从小于1毫秒到15毫秒不等。

问题是,有时将内容写入文件需要6秒钟,即使考虑到网络速度,这肯定太长了。

因此,我只是想知道是否有任何有效的方法使用VB.NET编写文件来提高性能? Java有一个非常好的名为BufferedOutputStream的工具,遗憾的是它在VB.NET中不可用(或者我还没有找到它)。

7 个答案:

答案 0 :(得分:13)

最快的选择:

首先将所有文字收集到一个大字符串中,然后使用System.IO.File.WriteAllText(text)

答案 1 :(得分:1)

这里有几件事要生效。但我发现利用 IO.File.AppendText 功能可以极大地加快编写过程。

此外,使用System.Text.Stringbuilder类而不是传统字符串(假设您要将文本进行联接以写入文件)可以进一步提高速度。

请参阅 Speeding up File Writing

答案 2 :(得分:1)

编写此函数是为了从数据库中读取并输出到文本文件。请随意将其作为起点。

 Sub MakeFile(ByVal Obj As Object)
    Dim CountRow As Integer = 0
    Dim TableName As String = CType(Obj, String())(0)
    Dim CommandText As String = CType(Obj, String())(1)


    Dim csvFileName As String = InitilizationSettings.DirectoryPath & TableName & ".txt"
    If File.Exists(csvFileName) Then
        File.Delete(csvFileName)
    End If
    Dim buffer() As Byte = {255}
    Dim FileObject As New FileStream(csvFileName, FileMode.OpenOrCreate)
    Dim MStream As New MemoryStream()
    Dim StreamWriterObj As New StreamWriter(MStream)
    Dim sb As New System.Text.StringBuilder
    Dim x As Integer = 0

    Dim reader As SqlDataReader
    Dim cmd As New SqlCommand()
    Dim conn As New SqlConnection(IOUtilities.GetConnectionString())


    conn.Open()


    With cmd
        .CommandText = CommandText
        .CommandTimeout = 1200
        .CommandType = CommandType.Text
        .Connection = conn
    End With

    reader = cmd.ExecuteReader()

    Do While reader.Read()
        'System.Console.Write("Loading rows to memory.../" & vbCr)
        sb.Append(Chr(34))
        sb.Append(reader.Item(0))
        'System.Console.Write("Loading rows to memory...|" & vbCr)
        sb.Append(Chr(34))
        For i = 1 To reader.FieldCount - 1
            sb.Append(",")
            sb.Append(Chr(34))
            sb.Append(reader.Item(i))
            sb.Append(Chr(34))
        Next
        'System.Console.Write("Loading rows to memory...\" & vbCr)



        sb.AppendLine()

        'Write every 10000 rows of data to the file from the buffer
        If x = 50000 Then
            StreamWriterObj.Write(sb.ToString().ToCharArray())
            MStream.Seek(0, SeekOrigin.Begin)
            MStream.WriteTo(FileObject)
            sb = New StringBuilder()
            CountRow = CountRow + x
            x = 0
        End If
        'System.Console.Write("Loading rows to memory...-" & vbCr)
        x = x + 1


        'LogEvents("Dumped " & strFileName & " to " & GetFilePath() & " at " & Now.ToString & vbCrLf & vbCrLf)
    Loop

    conn.Close()
    reader.Close()
    'Write any remaining data from the buffer to the file
    StreamWriterObj.Write(sb.ToString().ToCharArray())
    MStream.WriteTo(FileObject)
    FileObject.Close()

    System.Console.WriteLine(String.Format(vbCrLf & "Finished writing data to {1}", CountRow, csvFileName))

End Sub

答案 3 :(得分:1)

依次考虑这些:

  1. 在本地创建文件
  2. 将其复制到具有临时扩展名的远程文件夹
  3. 将远程文件重命名为原始文件名
  4. 步骤2和3如下(使用System.IO):

    string OriginalExtension = ".ok", TemporaryExtension = ".dat";
    string tmpFileRemote = RemoteFile.Replace(TemporaryExtension, OriginalExtension);
    File.Copy(fileName, RemoteFile, true);
    File.Copy(RemoteFile, tmpFileRemote, true);
    File.Delete(RemoteFile);
    

    第一个File.Copy需要时间。但由于它没有锁定人们正在使用的真实文件,因此它不会被锁定。第二个File.Copy实际上只是重命名文件并用刚刚上传的文件替换真实文件。 File.Delete删除上传的临时文件。

    希望有所帮助。

答案 4 :(得分:0)

一个旧帖子,但我认为还有一些事情需要补充:

使用以下方法一次性写入所有文本:
System.IO.File.WriteAllText(path As String,contents As String)。

但是,如果通过与远程位置的慢速连接写入文件,则仍需要时间。为避免用户读取​​部分写入的文件,您应将数据写入远程服务器上的临时文件。写完所有数据后,将临时文件复制到旧文件上,然后删除临时文件。

如果您想确实确定没有人读取部分写入的文件,您可以删除旧文件,然后移动/重命名临时文件以替换刚刚删除的文件。在这种情况下,您必须确保客户端程序正常处理文件未找到的错误,这些错误将不时发生。

答案 5 :(得分:-1)

首先考虑写入本地驱动器,然后将该文件移动到网络驱动器。

答案 6 :(得分:-1)

Sub writefile()
    Dim file As System.IO.StreamWriter
    file = My.Computer.FileSystem.OpenTextFileWriter("N:\GeneratedNumber.txt", False)
    file.WriteLine("Player1 Skill is " & Skill(0))
    file.WriteLine("Player1 Strength is " & Skill(1))
    file.WriteLine("Player2 Skill is " & Skill(2))
    file.WriteLine("Player2 Strength is " & Skill(3))
    file.Close()
End Sub