
 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