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 :

Progression d'une copie de fichier en binaire ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Par défaut Progression d'une copie de fichier en binaire ?
    Bonjour

    J'ai un petit souci, je cherche à afficher la progression lors de la copie d'un fichier avec cette procédure :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    public virtual void CopyStreams2(string filesrc, string filedest, CopyProgressHandler handler)
            {
                int i;
                FileStream fin, fout;
                long done = 0, total = 0;
     
                try
                {
                    // open input file 
                    try
                    {
                        fin = new FileStream(filesrc, FileMode.Open);
                        total = fin.Length;
                    }
                    catch (FileNotFoundException exc)
                    {
                        Console.WriteLine(exc.Message + "\nInput File Not Found");
                        return;
                    }
     
                    // open output file 
                    try
                    {
                        fout = new FileStream(filedest, FileMode.Create);
                    }
                    catch (IOException exc)
                    {
                        Console.WriteLine(exc.Message + "\nError Opening Output File");
                        return;
                    }
                }
                catch (IndexOutOfRangeException exc)
                {
                    Console.WriteLine(exc.Message + "\nUsage: CopyFile From To");
                    return;
                }
     
                // Copy File 
                try
                {
                    do
                    {
                        i = fin.ReadByte();
                        if (i != -1)
                        {
                            fout.WriteByte((byte)i);
                            if (handler != null)
                            {
                                done = fin.Position;
                                if ((done % 8) == 0) // taille d'un octet on incrémente la progression
                                    handler(total, done, total - done, (double)done / (double)total);
                            }
                        }
     
                    } while (i != -1);
                }
                catch (IOException exc)
                {
                    Console.WriteLine(exc.Message + "File Error");
                }
     
                fin.Close();
                fout.Close();
            }
    Comment puis je afficher la progression de copie via une ProgressBar de valeur MAX 100 ? Comme vous pouvez le voir, j'ai commencé à faire quelque chose mais la progression s'effectue mal.

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    Citation Envoyé par Shypster Voir le message
    j'ai commencé à faire quelque chose mais la progression s'effectue mal.
    C'est a dire ? tu as des retards ? des sauts de progression ?


    PS: pense a fermer tes Streams dans le finaly de tes bloc try-catch ;-)

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Par défaut
    La progression est trés en retard par rapport à la copie.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par ZaaN Voir le message
    PS: pense a fermer tes Streams dans le finaly de tes bloc try-catch ;-)
    Ou mieux, utilise des blocs using

    Citation Envoyé par Shypster Voir le message
    La progression est trés en retard par rapport à la copie.
    Normal, si tu utilises le thread d'interface pour faire la copie, l'interface ne se met plus à jour... Il faut effectuer la copie dans un thread séparé (ou dans un BackgroundWorker, plus simple)

    D'autre part, copier les fichiers octet par octet est très inefficace... utilise plutôt un buffer de 4 ou 8 Ko

  5. #5
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Par défaut
    voilà d'aprés vos remarques, mon code modifié :

    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
    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);
    }
    }
    }
    Qu'en pensez - vous, la progression se passe bien mais par rapport à un corbian backup, mon application met env 10 min de plus pour copier un même fichier. Puis-je optimiser le code pour qu'il s'exécute plus rapidement ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu pourrais essayer de changer la taille du buffer en cherchant la taille optimale. A part ça je vois pas trop comment tu peux améliorer...
    Les 10 minutes d'écart, c'est sur un fichier de quelle taille ? la copie dure combien au total ?

Discussions similaires

  1. Progression d'une copie d'un fichier
    Par Seth77 dans le forum C#
    Réponses: 16
    Dernier message: 25/09/2012, 16h26
  2. Réponses: 9
    Dernier message: 11/05/2012, 10h40
  3. Réponses: 2
    Dernier message: 22/03/2007, 13h25
  4. Problème pour faire une copie de fichier.
    Par damien99 dans le forum C++
    Réponses: 1
    Dernier message: 12/02/2006, 16h37
  5. Réponses: 3
    Dernier message: 19/10/2005, 15h58

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