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++Builder Discussion :

Copier un fichier en C++ [Débutant]


Sujet :

C++Builder

  1. #1
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut Copier un fichier en C++
    Bonjour,

    j'ai un peu honte de poster cela, je vais passer pour un gros noob mais pas grave

    Quelle commande utilisez-vous pour faire une copie de fichier d'un endroit (exemple : clef usb ) vers un autre ( exemple : disque dur c:\test ")

    J'ai toujours utilisé CopyFileEx jusqu'à présent, qui me permet d'appeler une fonction callback pour mettre à jour une barre de progression.

    Le seul truc un peu embêtant est que je ne suis jamais arrivé à mettre la callback dans une classe, mais c'est peut-être impossible à faire du fait de la nature de la fonction (callback).

    Par contre sur plus d'une centaine de fichiers copiés avec succès, j'ai deux fichiers de grosse taille ( 1.7 et 1.6 Go ) qui sortent en erreur ( retour de la fonction FileCopyEx à false ).

    Est-ce qu'il y a une limite à cette fonction ou bien ?
    J'ai regardé un peu sur l'aide XE3 mais ils ne parlent pas de limitation

    Et pourtant c'est quand même étrange que pile poile les deux fichiers qui ne veulent pas se copier sont tous les deux de grosse taille.

    Qu'en pensez-vous ?
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, est-ce que tu as essayer d'utiliser TFile::Copy?
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    J'utilise les API pour faire ça. SHFileOperation.
    Pour le shell, je fais confiance au shell et d'une version de Windows à l'autre ça se passe bien.
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Ce n'est vraiment pas compliqué à programmer. Le seul truc est qu'il faut séparer les noms de fichier dans la liste (szFrom) avec \0 et mettre un \0 supplémentaire à la fin (soit 2 \0\0).

    A noter que depuis Vista Microsoft recommande de ne plus utiliser SHFileOperation mais IFileOperation. Evidemment IFileOperation ne fonctionnera pas sous XP.

  4. #4
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Merci à tous les deux pour vos réponses,

    J'ai testé la fonction Copy, elle fonctionne même sur les gros fichiers.
    On a donc bien une limitation sur la commande CopyFileEx, mais pour info je suis sur image VMware windows XP, donc peut-etre une limite de l'OS XP 32bits ?

    Bref, je vais faire comme ça pour l'instant, on a pas la barre d'avancement ( pas de callback ) mais c'est pas grave, ça me permet de ne pas rester bloqué déjà c'est pas mal !!

    Je donne le code si des fois quelqu'un en a besoin un jour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <System.IOUtils.hpp> // ne pas oublier de mettre ça en début de programme
     
    TFile *b;
    b = new TFile();
     
    b->Copy("test.bin","c:\\test\\test.bin");
     
    delete b;
    b=NULL;
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  5. #5
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Citation Envoyé par Argol_Medusa Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <System.IOUtils.hpp> // ne pas oublier de mettre ça en début de programme
     
    TFile *b;
    b = new TFile();
     
    b->Copy("test.bin","c:\\test\\test.bin");
     
    delete b;
    b=NULL;
    Salut tu as trop de code pour rien La fonction Copy de TFile est static:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	static void __fastcall Copy(const System::UnicodeString SourceFileName, const System::UnicodeString DestFileName)/* overload */;
    Donc tu pourrais simplement faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <System.IOUtils.hpp> // ne pas oublier de mettre ça en début de programme
     
    TFile::Copy("test.bin","c:\\test\\test.bin");
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  6. #6
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Ha oui effectivement, très bonne remarque
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  7. #7
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 55
    Points : 54
    Points
    54
    Par défaut CopyFileEx
    Juste pour info CopyFileEx peut copier des fichiers bien supérieurs à 2Go
    je l'utilise dans un vieux programme depuis longtemps
    je viens de copier un fichier de 3,8Go sans le moindre problème
    sans être sûr de ce que j'avance il me semble avoir eu un problème à l'époque qui venait du calcul du progressbar
    une valeur qu'il à fallu multiplier par 4 pour les gros fichiers
    il faudrait que je fouille pas mal pour trouver ce que j'ai fait pour remédier à cela

  8. #8
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Merci pour les informations.
    Par contre je te confirme que ça ne vient pas de la ProgressBar de mon coté, c'est vraiment la fonction CopyFileEx qui me remonte une erreur dès son exécution, mon problème semble donc est différent du tiens.

    Du coup j'avais résolu le problème en passant par une autre fonction, et je n'ai pas creusé plus.
    Ca dépend peut-être des OS c'est très étrange en tout cas.
    Désolé, on savait pas que c'était impossible, alors on l'a fait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. copier des fichiers
    Par Daeron dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/11/2004, 14h45
  2. Copier certains fichiers d'une arborescence ?
    Par narmataru dans le forum Linux
    Réponses: 4
    Dernier message: 27/04/2004, 12h15
  3. Copier coller Fichier windows
    Par KPitN dans le forum Windows
    Réponses: 8
    Dernier message: 20/04/2004, 17h32
  4. Batch pour copier des fichier
    Par borgfabr dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 09/03/2004, 07h55
  5. Détourner une fonction pour copier un fichier en mémoire
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/11/2003, 08h29

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