Lire à la fin du fichier, puis chercher vers l'arrière jusqu'à ce que vous trouver une dizaine de retours à la ligne, puis de les lire avant la fin en prenant en considération les différents codages. Assurez-vous de traiter les cas où le nombre de lignes dans le fichier est inférieur à dix. Ci-dessous est une mise en œuvre (en C# comme marqués ce), généralisée pour trouver le dernier numberOfTokens
le fichier situé à l' path
codé en encoding
où le jeton séparateur est représenté par tokenSeparator
; le résultat est renvoyé en tant que string
(ce qui pourrait être amélioré par le retour d'un IEnumerable<string>
qui énumère les jetons).
public static string ReadEndTokens(string path, Int64 numberOfTokens, Encoding encoding, string tokenSeparator) {
int sizeOfChar = encoding.GetByteCount("\n");
byte[] buffer = encoding.GetBytes(tokenSeparator);
using (FileStream fs = new FileStream(path, FileMode.Open)) {
Int64 tokenCount = 0;
Int64 endPosition = fs.Length / sizeOfChar;
for (Int64 position = sizeOfChar; position < endPosition; position += sizeOfChar) {
fs.Seek(-position, SeekOrigin.End);
fs.Read(buffer, 0, buffer.Length);
if (encoding.GetString(buffer) == tokenSeparator) {
tokenCount++;
if (tokenCount == numberOfTokens) {
byte[] returnBuffer = new byte[fs.Length - fs.Position];
fs.Read(returnBuffer, 0, returnBuffer.Length);
return encoding.GetString(returnBuffer);
}
}
}
// handle case where number of tokens in file is less than numberOfTokens
fs.Seek(0, SeekOrigin.Begin);
buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
return encoding.GetString(buffer);
}
}