1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| function CopyAndSaveFragsFile(const FileNameSource,FileNameDest : String) : longint;
// Copie des fragments de FileNameSource dans FileNameDest
// Renvoie le nombre de lignes de FileNameDest
// Utilisable pour des fichiers-sources structurés comme suit :
// '---ABCDEFGHIJ----------123456789------------987654----#13#10'
// '---BYUJOLMPGF----------284569752------------358796----#13#10'
// ici les '-' représentent les parties indésirables et le reste les fragments à récupérer
// Structure du fichier de destination :
// 'ABCDEFGHIJ123456789987654#13#10
// 'BYUJOLMPGF284569752358796#13#10
// Pour fichiers-source de taille inférieure à 2 Go.
const pos1 = 3; size1 = 10; //<- Positions et tailles de chaque fragment à
pos2 = 23; size2 = 9; // récupérer dans chaque ligne du fichier-source.
pos3 = 44; size3 = 6;
pos4 = 75; size4 = 7;
pos5 =113; size5 = 9;
Pas =124; // Pas dépendant de la Longueur d'une ligne du fichier-source. CRLF = #13#10;
var FS : tFileStream; // Fichier-Source
FD : tFileStream; // Fichier-Destination
from1,from2,from3,from4,from5,po : integer;
SizeFiSource : integer;
begin Result:=0;
if (not FileExists(FileNameSource)) then
begin Showmessage('Fichier '+FileNameSource+' : inexistant'); EXIT; end;
try FS := TFileStream.create(FileNameSource, fmOpenRead or fmShareDenyWrite);
FD := TFileStream.create(FileNameDest, fmCreate);
SizeFiSource:=FS.size;
from1:=pos1; from2:=pos2; from3:=pos3; from4:=pos4; from5:=pos5;
repeat // Copie du 1er fragment :
FS.Position := from1;
if FS.Position>=SizeFiSource then Break;
FD.CopyFrom(FS, size1);
// Copie du 2ième fragment :
FS.Position := from2;
FD.CopyFrom(FS, size2);
// Copie du 3ième fragment :
FS.Position := from3;
FD.CopyFrom(FS, size3);
// Copie du 4ième fragment :
FS.Position := from4;
FD.CopyFrom(FS, size4);
// Copie du 5ième fragment :
FS.Position := from5;
FD.CopyFrom(FS, size5);
FD.write(PChar(CRLF)^,2); // Ajout du CRLF de fin de ligne
// Calcul des from pour la ligne suivante :
inc(from1,Pas); inc(from2,pas); inc(from3,Pas);
inc(from4,Pas); inc(from5,pas);
inc(Result);
until From1 >= SizeFiSource;
finally
FS.Free;
FD.Free
end;
end; |
Partager