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 :

Copie de fichier avec barre de progression


Sujet :

C#

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut Copie de fichier avec barre de progression
    Bonjour,

    Je dois réaliser une fenêtre montrant l'avancement de la copie de 1 à n fichiers.
    De façon standard, une première barre de progression indiquera le nombre de fichiers déjà copiés. La seconde barre de progression montrera l'avancement en % pour chaque fichier en cas de transferts de volumes importants de données.

    "System.IO.File.Copy()" ne fournit pas d'indication de pourcentage effectué.

    Existe t-il une méthode pour faire une copie de fichier, qui renverra un pourcentage d'avancement par déclenchement d'évènement ?

    Ou devrai-je passer par un système de copie de block de données codé par mes petites minimes ?

    Papy !
    J-L aka Papy pour les amis

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Ou devrai-je passer par un système de copie de block de données codé par mes petites mimines perso ?
    C'est plutôt ça à mon avis. Tu lis le fichier par paquet et tu le réécrit par paquet.
    Pas de questions techniques par MP

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut papy

    Désolé, j'ai plus le nom de la fonction, mais on l'avait déja sité ici sur developpez.com... c'est une fonction de l'api Win32 qui te fait cela
    (enfin, il me semble que tu définis la callback)

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  4. #4
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Est-ce que tout bêtement, à partir de la taille totale du fichier, tu ne pourrais pas interroger la taille du nouveau fichier en cours de copie à intervalles réguliers pour faire avancer ta barre de progression ? C'est une supposition, je n'ai pas essayé.

    Sinon, sur la MSDN, j'ai trouvé un IFileSyncProviderCallback::OnFileCopyProgress avec les évènements qui vont bien. Mais c'est du C++ Je ne sais pas dans quelle mesure il est possible de l'utiliser en C#.

    Voilà pour les pistes que je peux te donner.

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Le coder soit même ne coûte pas cher, alors pourquoi s'embêter à utiliser des fonctions natives ou bizarres ? ça devrais juste faire un truc genre ça : (non testé)

    Code c# : 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
     
    public delegate void CopyProgressHandler(long total, long done, long left, double percent);
     
    public virtual void CopyStreams(Stream a, Stream b, CopyProgressHandler handler)
    {
      int bufSize = 4 * 1024; /* 4 ko */
      byte[] buffer = new byte[bufSize];
      long done = 0;
      long total = a.Length;
      int tmp = 0;
      while ((tmp = a.Read(buffer,0,bufSize)) > 0)
      {
        b.Write(buffer,0,tmp);
        if(handler != null)
        {
          done+=tmp;
          handler(total, done, total - done, (double)done / (double)total);
        }
       }
    }
    Et après il suffit d'appeler la fonction sur un flux, et pour copier un fichier le flux va être un FileStream ...

    Après avec une méthode un peut plus luxueuse on peut le faire un asynchrone avec un thread séparé. ça non plus ça ne coûte pas cher ...

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut
    StormimOn:
    J'allais partir sur ce concept sans solution plus simple.

    theMonz31:
    J'ai bien trouvé copyfile mais je n'ai vu aucune référence pour un callback éventuel.

    Skalp:
    C'est aussi une solution que j'avais envisagé mais tout en me demandant si windows saurait me donner une taille réaliste pendant l'opération de copie. Je n'ai pas encore testé.
    Pour le FileSyncProvider, je suis remonté jusque là:
    http://msdn.microsoft.com/fr-fr/libr...cprovider.aspx
    Mais je n'en ttrouve aucune référence possible dans C# sur Microsoft.Synchronization.Files . Ca ferait partie de "Microsoft Sync Framework" qui ne semble pas installé en standard. Du coup, impossible à utiliser dans mon cas (enfin, je pense). Mais merci quand même de cette piste.

    smyley:
    Ton code fonctionne très bien après un test sur un fichier de 1.4go. Pour le traitement, si je l'utilise, je le ferai dans un backgroundworker tout en augmentant la taille du buffer, sinon, c'est beaucoup trop long. Tiens, d'ailleurs, à ce propos, quelle serait à ton avis la taille raisonnable du buffer pour copier de gros fichiers avec ce code ?


    Et évidemment, un grand merci à tous pour votre aide
    J-L aka Papy pour les amis

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 448
    Points : 3 086
    Points
    3 086
    Par défaut
    Il semble que la taille par défaut utilisée par windows lors des opérations de copie soit de 64ko. Je vais donc utiliser ça.
    J-L aka Papy pour les amis

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

Discussions similaires

  1. download de fichier avec barre de progression
    Par dede92 dans le forum Langage
    Réponses: 0
    Dernier message: 10/04/2015, 18h53
  2. Réponses: 2
    Dernier message: 11/04/2013, 16h04
  3. Javascript copy de repertoire avec barre de progression
    Par avalokitech dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 10/01/2011, 16h56
  4. copie de répertoire avec barre de progression
    Par s7even dans le forum Windows Forms
    Réponses: 5
    Dernier message: 10/12/2009, 19h36
  5. Copie de fichiers avec détails de progression
    Par Shypster dans le forum C#
    Réponses: 1
    Dernier message: 04/11/2008, 22h51

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