[HELP ME PLZ] Télécharger avec reprise...

cs_fadiese Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 9 novembre 2009 - 17 nov. 2005 à 12:54
cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 - 18 nov. 2005 à 09:03
Bonjour à tous,

je recherche une méthode pour télécharger des fichiers avec une possibilité de reprise et, si possible, en multi sections, un peu comme le fait "Free Download Manager".

Le but étant surtout de pouvoir reprendre ultérieurement un téléchargement là où il fut stoppé sans avoir à tout recharger depuis le début...

Merci

fa

1 réponse

cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
18 nov. 2005 à 09:03
Pour le multi-section, il faut que tu Pré-allou la place du fichier ( par exemple si tu veux DL un fichier de 1Mo, avant même le debut de l'écriture dans le fichier, tu dois lui donner la taille de 1Mo)

Ensuite pour chaque "thread" de DL tu dois creer un objet avec un Socket ( avec le compo socket que tu veux Indy ou ICS ou autre)
Par exemple avec le compo ICS
Type
TDownloadSection=Class(TObject)
Private
FEndOffset: Cardinal;
FFileStream: TFileStream;
FSocket: TWSocket;
Procedure OnDataAvailable(Sender: TObject; Error: Word);
Public
Constructor Create(Const FileName, Adress, Port: String);
Destructor Destroy; Override;
Procedure Connect(BeginOffset, EndOffset: Cardinal);
Procedure Disconnect;

Property EndOffSet: Cardinal Read FEndOffset Write FEndOffset;
End;

Procedure TDownloadSection.OnDataAvailable(Sender: TObject; Error: Word);
Var
Buffer: Array[0..1023] Of Byte;
ReceiveCount: Integer;
begin
Repeat
ReceiveCount:=WSocket1.Receive(@Buffer, SizeOf(Buffer));
If ReceiveCount>0 Then
FFileStream.Write(@Buffer, ReceiveCount);
Until((ReceiveCount<=0) Or (FFileStream.Position>FEndOffset));
End;

...Etc je vais pas tout te faire surtout que ça va dépendre du protocole de DL
BeginOffset et EndOffset representant les positions de debut et fin du DL

Enfin il faut que tu sache ce que tu as déjà DL et ce qu'il te reste a dl, pour ça je te conseil pour chaque fichier en cours de dl de stocker simplement les valeurs de debut et fin de chaque Section
TSectionInfo=Record
BeginOffset: Cardinal;
EndOffset : Cardinal;
End;
Ensuite que tu reprend ton DL, tu relis ce fichier et tu saura exactement où tu en est.
Tu peux utiliser des Int64 au lieu des cardinal si tu compte faire des fichiers de plus de 4Go ( mais il me semble que FileStream ne les gere pas )

bouh
0
Rejoignez-nous