Je travaille actuellement sur une méthode qui prend un fichier texte et le réduit à ~10 Mo. Cette méthode est utilisée pour tronquer les fichiers journaux et les maintenir dans une limite de 10 Mo.
La logique derrière le code est essentiellement la suivante... si le fichier est de 250 Mo ou plus, lire les octets jusqu'à ce que le tableau atteigne 250 Mo. Stockez-les dans un fichier StringBuilder
la position pour la lecture suivante et répétez jusqu'à ce que la touche StringBuilder
contient ~10 MB de données. Ensuite, on écrit dans le fichier en effaçant toutes les données et en ne laissant que 10 Mo des écritures les plus récentes.
Pour éviter de couper des lignes en deux, il vérifie où se trouve la dernière CrLf
et écrit ensuite toutes les données à partir de ce point.
Mon problème est que je ne peut pas faire en sorte que la recherche se positionne correctement après la première lecture. Il lit les données correctement la première fois, puis lorsque j'utilise la position de la lecture précédente pour l'itération suivante, il "ignore" la position et lit à nouveau depuis le début du fichier.
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