gpt4 book ai didi

vb.net - 设置 FileStream.Seek 的位置/索引以检索数据 VB.NET 的 "blocks"

转载 作者:行者123 更新时间:2023-12-01 05:28:14 26 4
gpt4 key购买 nike

我目前正在研究一种接收文本文件并将文件减少到约 10 MB 的方法。此方法用于截断日志文件并将它们保持在 10 MB 的限制内。

代码背后的逻辑基本上是这样的……如果文件是 250 MB 或更大,则读取字节直到数组达到 250 MB。将此存储到 StringBuilder , 设置下一次读取的位置并重复直到 StringBuilder包含约 10 MB 的数据。然后写入文件,删除所有数据,只留下 10 MB 最近写入的内容。

为防止将线切割成两半,它会检查最后 CrLf 的位置。是然后写出从那个点向前的所有数据。

我的问题是我无法在第一次阅读后正确定位自己。它首先正确读取数据,然后当我使用上一次读取中的该位置进行下一次迭代时,它“忽略”该位置并再次从文件的开头读取。

If logFile.Length > (1024 * 1024 * 250) Then
Dim DataToDelete As Integer = logFile.Length - (1024 * 1024 * 250)
Dim ArrayIndex As Integer = 0
While DataToDelete > 0
Using fs As FileStream = New FileStream(logFile.FullName, FileMode.Open, FileAccess.ReadWrite)
fs.Seek(ArrayIndex, SeekOrigin.Begin)
If strBuilder.Length < (1024 * 1024 * 250) Then
Dim bytes() As Byte = New Byte((1024 * 1024 * 250)) {}
Dim n As Integer = fs.Read(bytes, 0, (1024 * 1024 * 250))
ArrayIndex = bytes.Length
Dim enc As Encoding = Encoding.UTF8
strBuilder.Append(enc.GetString(bytes))
Else
If DataToDelete - strBuilder.Length < 0 And strBuilder.Length > (1024 * 1024 * My.Settings.Threshold) Then
Dim DataToCut As Integer = strBuilder.Length - (1024 * 1024 * My.Settings.Threshold)
While Not (strBuilder.Chars(DataToCut).ToString.Equals(vbCr)) And DataToCut <> 0
DataToCut -= 1
End While
strBuilder.Remove(0, DataToCut)
File.WriteAllText(logFile.FullName, strBuilder.ToString)
Else
DataToDelete -= strBuilder.Length
strBuilder.Clear()
End If
End If
End Using
End While
End If

最佳答案

对于您正在做的事情,将整个文件加载到内存中是不必要的,而且真的不是一个好主意。最好只读取您打算保留的日志文件部分(最后 10MB)。例如,做这样的事情会更简单、更有效:

Private Sub ShrinkLog(ByVal filePath As String, ByVal maxSize As Integer)
Dim buffer As String
If New FileInfo(filePath).Length > maxSize Then
Using reader As New StreamReader(filePath)
reader.BaseStream.Seek(-maxSize, SeekOrigin.End)
buffer = reader.ReadToEnd()
End Using
File.WriteAllText(filePath, buffer)
End If
End Sub

还有其他方法可以做到这一点。如果您要保留文件的较大部分,甚至不将所有文件都加载到内存中,而是直接从一个流转到另一个流,那么效率会更高。此外,这个简单的例子没有展示如何避免在文件中的一部分切掉一行,但我相信你可以一次继续寻找一个字节,直到找到第一个换行符。

关于vb.net - 设置 FileStream.Seek 的位置/索引以检索数据 VB.NET 的 "blocks",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804488/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com