私は現在、テキスト ファイルを取り込み、ファイルを 10 MB まで削減する方法に取り組んでいます。この方法は、ログ ファイルを切り捨て、10 MB の制限内に保つために使用されます。
コードの背後にあるロジックは基本的にこれです...ファイルが250 MB以上の場合、配列が250 MBに達するまでバイトを読み取ります。これをに保存し、次の読み取りのために位置を設定し、 〜10 MB のデータが含まStringBuilder
れるまで繰り返します。StringBuilder
次に、ファイルに書き込み、すべてのデータを消去し、最新の書き込みの 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