Buffer dynamique

Buffer dynamique - Delphi/Pascal - Programmation

Marsh Posté le 03-04-2005 à 19:38:13    

Yop les zoulou :hello:,
 
Le sujet du problème est simple  :) :
 
- Un fichier source à partir duquel on lit les données,
- Un fichier destination dans lequel on écrit les données lues précédement,
- Un buffer qui est chargé de contenir les données lues depuis source pour alimenter l'écriture dans destination
 
Fidèle à moi-même, je ne sais pas du tout quelle taille donner à ce buffer de type tableau de char mais pour l'instant j'ai mis 64ko parce que ça sonne bien :D.
 
Or, il se trouve que pendant la lecture/écriture, il arrive (souvent) qu'on se trouve dans le cas suivant :
 
- lorsqu'on arrive à la fin de la lecture du fichier source, la taille des données restantes à lire est inférieur à la taille du buffer (qui est de 65536 octets).
 
Apparement, on peut pas lire par exemple les 58ko restants d'un fichier dans un buffer de 64ko et donc ça bloque à cet endroit... :sweat:  
 
Le but du jeu serait donc de définir la taille du buffer à la taille des données restantes à lire...mais je sais pas comment qu'on fait :D  
 
Un grand help à vous tous (antp) :jap:

Reply

Marsh Posté le 03-04-2005 à 19:38:13   

Reply

Marsh Posté le 03-04-2005 à 21:38:05    

Comment ça "on peut pas" ? Tu lis avec quoi ? Si c'est avec un TFileStream il y a Read ou ReadBuffer (je sais plus lequel) qui te donne la longueur réelle lue.
Note qu'avec le TFileStream tu fais un CopyFrom et c'est bon :D Ou encore plus simple t'appelles CopyFile ou SHFileOperation :o


Message édité par antp le 03-04-2005 à 21:38:42

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-04-2005 à 22:24:17    

Je suis dans ma période Api Win32, donc je me limite à CreateFile, ReadFile, WriteFile, SetFilePointer et CloseHandle.
 


buffer: array[0..65535] of char;
 
 
ZeroMemory(@buffer, sizeof(buffer));
 
[...]
 
Source := CreateFile(PChar(src), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
Dest:= CreateFile(PChar(dest), GENERIC_WRITE, 0, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
 
[...]
 
alire := sizeof(buffer);
aecrire := alire;
totalecrit := 0;
 
while totalecrit < total do
begin
// si "alire" est inférieur à la taille du buffer,  
// alors la fonction ne lit rien du tout :(
 
   ReadFile(Source, buffer, alire, lu, nil);
   WriteFile(Dest, buffer, aecrire, ecrit, nil);
 
   if totalecrit + alire > total then
      begin
         alire := total  - totalecrit ;
         aecrire := alire;
      end;
end;


Message édité par Inekman le 03-04-2005 à 22:25:20
Reply

Marsh Posté le 04-04-2005 à 21:20:54    

avouez que c'est bizarre quand même :'(

Reply

Marsh Posté le 05-04-2005 à 09:42:06    

Bizarre... Dans Delphi pour le TFileStream ils font pourtant comme ça


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-04-2005 à 12:45:36    

ayé j'ai trouvé l'erreur. le flag "FILE_FLAG_NO_BUFFERING" faisait foirer le truc pour je ne sais quelles raisons. J'ai remi à FILE_ATTRIBUTE_NORMAL et ça roule.
 
Merci antp de t'être penché sur le problème ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed