Envoyé par
Andnotor
Envoyé par
Jipété;
while TotalBytesRead < FileStream.Size do
Et c'est correct
Envoyé par
Andnotor
La seule chose qui ne doit pas être omise dans ce cas-là est FileStream.Position := 0.
Alors ça c'est curieux, j'ai même testé, pour voir (en me disant que juste après un Create, Position ne pouvait qu'être à 0) et effectivement ça donne ça :
Pourquoi cette précaution, alors ? Il pourrait en être autrement ?
Envoyé par
BeanzMaster
Non non et ca c'est quoi
1 2 3 4 5 6
| // Do something with Buffer data
if Buffer[0]<>'A' then
begin
HasError := True;
Break;
end; |
Mea culpa, mea maxima culpa : cette chose me gênait au milieu de la lecture du fichier, je l'ai virée puis oubliée,
À ma décharge, je dirais que je ne voulais pas mélanger la récupération des données du fichier et leur traitement si lecture ok.
Envoyé par
tourlourou
C'est pire en cas d'erreur de lecture renvoyant -1...
Ah ben vi, si tu remets une pièce dans le juke-box, on va jamais voir le bout du tunnel,
Je rappelle que je voulais juste corriger la faute dans l'exemple, pas le récrire de fond en comble,
Bref, du coup j'ai pondu ça, et ça se passe en deux temps (sinon c'est infâme et tout embrouillé) -- ah, j'ai renommé HasError en ReadError :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| fss := FileStream.Size; // speed-up
while TotalBytesRead < fss do
begin
BytesRead := FileStream.Read(Buffer, sizeof(Buffer)); // Read in sizeof(Buffer) bytes of data
case BytesRead of
-1: Break; // erreur fatale
0 : begin // erreur de lecture ?
ReadError := (TotalBytesRead <> FileStream.Size);
Break;
end;
else inc(TotalBytesRead, BytesRead); // Increase TotalBytesRead by the number of bytes read
end; // case
end; // while
finally
FileStream.Free;
end; // try
case BytesRead of
-1: ShowMessage('ERREUR FATALE');
0 : if ReadError then ShowMessage('ERREUR DE LECTURE');
else // Do something with Buffer data
ShowMessage(IntToStr(TotalBytesRead)); // 146 ou 3578
end; |
J'ai testé en forçant BytesRead avant le 1er case et, ma foi, ça le fait.
Alors, puisque Andnotor confirme ma justesse de vue à propos du test, retour au post no 1 et si quelqu'un a un compte pour poster sur leur wiki, page "Discussion", faudrait leur coller ça :
+++
Wrong test in last example of Generic files of any type (starting with "With larger files of many Gb, ...")
Hello,
The test
while TotalBytesRead <= FileStream.Size do // While the amount of data read is less than or equal to the size of the stream do
never terminates... Should be
while TotalBytesRead < FileStream.Size do // While the amount of data read is less than to the size of the stream do
Best regards,
+++
Merci à celui qui s'y colle.
Partager