IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Copier des fichiers avec reprise


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 50
    Points : 60
    Points
    60
    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 : 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
    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.

  2. #2
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Le premier truc qui m'interpelle c'est
    delete buffer;
    il faudrait utiliser
    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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    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.

    ++

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/02/2015, 09h52
  2. Réponses: 2
    Dernier message: 19/05/2014, 14h39
  3. copier des fichiers avec progressbar
    Par coolirc dans le forum Débuter
    Réponses: 8
    Dernier message: 28/04/2014, 20h05
  4. Copier des fichiers avec une contrainte de date
    Par jejeapollo dans le forum VBScript
    Réponses: 1
    Dernier message: 02/07/2009, 09h43
  5. Batch pour copier des fichier
    Par borgfabr dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 09/03/2004, 07h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo