Tout est dans le titre. Est-ce que ceci est possible ? Gestion de curseur ?
Les fichiers textes que je traite font plus de 200Mo... J'aimerais bien ne pas avoir à les parcourir pour récupérer une date sur la denière ligne
Tout est dans le titre. Est-ce que ceci est possible ? Gestion de curseur ?
Les fichiers textes que je traite font plus de 200Mo... J'aimerais bien ne pas avoir à les parcourir pour récupérer une date sur la denière ligne
Peut-être que la méthode Seek() de la classe Stream te sera utile :
Bonjour aeled
Pour y arriver notamment selon la suggestion de Manralf, il te faut une petite fonction qui te retourne la position de debut de la dernière ligne. Ceci n'est gérable que si déjà le fichier ne se termine au maximum que par un seul retour à la ligne
Ensuite il ne reste plus qu'à t'en servir
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 private static long FindLastLinePosition(BinaryReader br) { long index = br.BaseStream.Length - 2; char repere = '\n'; br.BaseStream.Position = index; char current = br.ReadChar(); while (!(current.Equals(repere))) { index -= 1; br.BaseStream.Position = index; current = br.ReadChar(); } return index + 1; }
Exemple Test-Console
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public static void Main(string[] args) { GetLastLine();} private static void GetLastLine() { string path = @"C:\rapport.txt"; BinaryReader br = null; StreamReader sr = null; long position; //test pour la recupération de la position br = new BinaryReader(File.Open(path, FileMode.Open)); position = FindLastLinePosition(br); Console.WriteLine("position : " + position.ToString()); br.Close(); //test pour lire juste la dernière ligne sr = new StreamReader(File.Open(path, FileMode.Open)); sr.BaseStream.Position = position; Console.WriteLine(sr.ReadLine()); }
Le code fonctionne. En revanche, il faut que je trouve une solution pour cette histoire de un seul retour chariot car ce n'est pas toujours le cas :s
Il faudra alors donc modifié quelque peu en ajoutant une autre fonctionnalité qui verifie la fin de fichier pour determiner le nombre de retour à la ligne
Soit modifier ainsi par exemple
Puis ajouter ceci par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 private static long FindLastLinePosition(BinaryReader br, long start) { br.BaseStream.Position = start; char current = br.ReadChar(); while (!(current.Equals('\n'))) { start -= 1; br.BaseStream.Position = start; current = br.ReadChar(); } return (start + 1); }
Donc a tester ainsi par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 private static long WithoutReturnPosition(BinaryReader br) { long index = br.BaseStream.Length - 1; br.BaseStream.Position = index; int current = (int)br.ReadChar(); while ((current == 10)||(current == 13)) { index -= 1; br.BaseStream.Position = index; current = (int)br.ReadChar(); } return (index - 1) ; }
Ici j'ai separé les fonctionnalités afin d'être clair mais tu pourrais très bien intégré le code de WithoutReturnPosition dans FindLastLinePosition histoire de ne faire que cet appel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 private static void GetLastLine() { string path = @"C:\rapport.txt"; BinaryReader br = null; StreamReader sr = null; long position; br = new BinaryReader(File.Open(path, FileMode.Open)); position = WithoutReturnPosition(br); position = FindLastLinePosition(br,position); br.Close(); sr = new StreamReader(File.Open(path, FileMode.Open)); sr.BaseStream.Position = position; Console.WriteLine(sr.ReadLine()); sr.Close(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 sr.BaseStream.Position = FindLastLinePosition(path);
Parfait, je place le tag résolu
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager