Précédent   Forum des professionnels en informatique > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 10h25   #1
Membre du Club
 
thomas tom
Inscription : août 2010
Messages : 44
Détails du profil
Informations personnelles :
Nom : thomas tom
Âge : 25

Informations forums :
Inscription : août 2010
Messages : 44
Points : 42
Points : 42
Par défaut Copier des fichiers avec reprise

Bonjour à tous,

Je souhaiterais copier des fichiers sur mon réseau local windows, et reprendre le téléchargement ultérieurement.

La copie se déroule bien la plupart du temps, même en reprenant le téléchargement après fermeture de l'application, mais échoue de temps en temps pour une raison que j'ignore bien sur.

En gros, je copie le fichier par blocs de 10000 octets. Dans le cas ou cela ne fonctionne pas, le fichier cible comporte des blocs vides 0x00. Comme si la dernière lecture d'octets n'avait pas fonctionné.

Voici ce que j'ai fait (je n'ai pas le code complet sous la main, je le poste dès que possible):

Code :
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
 
 
// J'ai une classe 'Transfert' avec une 'positionSrc' de type long
 
// Dans une boucle while(isRunning) {
 
ifstream in(nomSrc,ios::binary);
ofstream out(nomDst,ios::binary|ios::app);
 
if((in.fail())||(out.fail())) {
    // On recommence quelques secondes plus tard.
}
 
 
char* buffer = new buffer[10000];
 
// Je replace le pointeur de lecture dans le fichier source:
seekg(transfertCourant.positionSrc);
 
in.read(buffer,10000);
// Récupération du nombre d'octets réellement lus:
long tailleCopie = in.gcount();
 
out.write(buffer,tailleCopie);
 
if(in.eof()) {
 // Fin de la lecture. on arrête tout
}
 
// On récupère la position de lecture.
transfertCourant.positionSrc = in.tellg();
 
in.close();
out.close();
 
delete buffer;
 
// } fin du while
Sur de petits fichier, je ne rencontre pas d'erreur, mais sur de gros fichiers, la copie est longue et donc le débogage prend du temps.

Auriez vous des exemples ou des conseils à me donner pour repérer la source de l'erreur?

Comment stocker la position de lecture, sachant que tellg retourne un streampos? Actuellement je récupère la position dans un long que je stocke dans un fichier, mais un streampos n'est pas un long.

Quelqu'un pourrait-il me faire part de son expérience dans ce domaine?

Grands merci.
thomas41 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 11h40   #2
Membre éclairé
 
Avatar de themadmax
 
Inscription : juillet 2005
Messages : 424
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 424
Points : 383
Points : 383
Le premier truc qui m'interpelle c'est
Citation:
delete buffer;
il faudrait utiliser
Citation:
delete []buffer;
Sinon pour détecter des erreur avec les streams tu peux utiliser les exceptions:http://www.cplusplus.com/reference/i...os/exceptions/
__________________
________________________________________________
http://bliquid.fr : Blog sur Android et l'Acer Liquid
themadmax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 11h47   #3
Membre du Club
 
thomas tom
Inscription : août 2010
Messages : 44
Détails du profil
Informations personnelles :
Nom : thomas tom
Âge : 25

Informations forums :
Inscription : août 2010
Messages : 44
Points : 42
Points : 42
C'est bien delete [] buffer et non delete buffer (erreur de frappe).

Par contre, je vais effectivement tester les exceptions.
Merci pour le conseil. Je teste ça ce soir.

++
thomas41 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h27.


 
 
 
 
Partenaires

Hébergement Web