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):
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Partager