在vb.net中写入文本文件的有效方法
-
24-10-2019 - |
题
我们有一些需要编写(约18 kb)的信息,以存储在我们的一个网络驱动器上的.txt文件。该文件大约每15分钟重写一次,但实际上至少每秒阅读。我们当前正在使用StreamWriter编写文件。
该文件服务器位于远程位置,往返ping从少于1 ms到15 ms不等。
问题是,有时将内容写入文件的内容需要长达六秒钟,即使我们考虑网络速度,这绝对是太久了。
因此,我只是想知道是否有任何有效的方法可以使用vb.net来提高性能? Java有一个非常好的工具,名为BufferedOutputStream,不幸的是在vb.net中没有可用(或者我只是没有找到它)。
解决方案
最快的选项:
首先将所有文本收集到一个大字符串中,然后使用 System.IO.File.WriteAllText(text)
.
其他提示
该功能写为从数据库中读取并输出到文本文件。请随时将其用作起点。
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
依次考虑这些:
- 在本地创建文件
- 使用临时扩展程序将其复制到远程文件夹
- 将远程文件重命名为您的原始文件名称
步骤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.delete删除上传的临时文件。
希望有帮助。
这里有几件事生效。但是我发现这是利用的 io.file.appendtext 功能可以极大地加快写作过程。
此外,使用System.Text.StringBuilder类,而不是传统的字符串(假设您要注销文本要写入文件)可以更加提高速度。
看 加速文件写作.
一个旧线程,但我认为仍然可以添加一些东西:
立即使用:
system.io.file.writeAlText(路径为字符串,内容为字符串)。
但是,如果文件是通过与远程位置的慢连接写入的,仍然需要花费一些时间来编写文件。为了避免让用户阅读部分编写的文件,您应该将数据写入远程服务器上的临时文件。写入所有数据后,将临时文件复制到旧文件,然后删除临时文件。
如果你想成为 真的 当然,没有人会读取部分编写的文件,您可以删除旧文件,然后移动/重命名临时文件以替换刚删除的文件。在这种情况下,您必须确保客户端程序优雅地处理未发现错误的文件,这些错误将不可避免地发生。
考虑首先写入本地驱动器,然后将该文件移至您的网络驱动器。
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