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 :

Quel est la meilleur methode pour copier des fichiers


Sujet :

C#

  1. #1
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut Quel est la meilleur methode pour copier des fichiers
    Bonjour,

    je dois mettre en place une petite appli de style explorer qui va me permettre de copier des fichiers en local sur un serveur

    J'aurais voulu savoir quelle est la meilleur methode pour copier des fichiers sachant qu'il me faudrait l'etat d'avancement de la copie

    Methode 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File.Copy("monfichier.xls", "Destination/monfichier.xls");
    Methode 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    _sin = new FileStream("monfichier.xls", FileMode.Open);
    _sout = new FileStream("Destination/monfichier.xls", FileMode.Create);
    do
    {
       i = _sin.ReadByte();
       if (i != -1) _sout.WriteByte((byte)i);
    } while (i != -1);
    Methode 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    _sin = new StreamReader("monfichier.xls");
    _sout = new StreamWriter("Destination/monfichier.xls");
    while (_sin.EndOfStream == false)
    {
       line = _sin.ReadLine();
       _sout.WriteLine(line);
    }
    Autre question comment connaitre l'etat d'avancement de la copie ??

    Merci d'avance pour votre aide
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  2. #2
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    En lisant et écrivant byte par byte et en connaissant le taille de ton fichier, tu connais l'état d'avancement de la copie.

    Il serait peut etre intéressant de tester si le fichier existe déjà dans la destination et offrir à l'utilisateur le choix de l'écraser, ou pas.

  3. #3
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Citation Envoyé par neptune Voir le message
    Il serait peut etre intéressant de tester si le fichier existe déjà dans la destination et offrir à l'utilisateur le choix de l'écraser, ou pas.
    Ce ne sont que de simples exemples pour montrer les différentes possibilités de copie
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  4. #4
    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

    ou si tu es un peu "feignant", tu peux t'appuyer aussi sur cette api Win32 qui fait la majeure partie du travail pour toi

    le lien : Ici


    Voir , ce lien ci :
    chez Microsoft

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

  5. #5
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Merci pour l'info je vais regarder ca, le seul inconvéniant avec ta méthode c'est qu'elle ne passe pas sur Win98 mais ca ne devrait pas etre un probléme pour mon cas
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  6. #6
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    J'ai fait un exemple ci-dessous

    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
            private Thread thr;
            private Thread thr2;
            private FileStream _sin;
            private FileStream _sout;
            private long _mCurrent;
            private long _mSize;
     
            public FileCopy(string inFS, string ouFS)
            {
                try
                {
                    this.thr = new Thread(new ThreadStart(copy));
                    this.thr2 = new Thread(new ThreadStart(refresh));
                    _sin = new FileStream(inFS, FileMode.Open);
                    _sout = new FileStream(ouFS, FileMode.Create);
     
                    thr.Start();
                    thr2.Start();
                }
                catch (Exception ex) { Console.WriteLine("Erreur :  " + ex.Message); }
            }
     
            private void copy()
            {
                try
                {
                    this._mSize = _sin.Length;
                    this._mCurrent = 0;
                    int i;
                    do
                    {
                        i = _sin.ReadByte();
                        if (i != -1) _sout.WriteByte((byte)i);
                        this._mCurrent++;
                    } while (i != -1);
                }
                catch (Exception ex) { Console.WriteLine("Erreur :  " + ex.Message); }
     
            }
     
            private void refresh()
            {
                Console.Clear();
                long _last, percent;
                while (this._mCurrent != this._mSize)
                {
                        _last = this._mCurrent;
                        percent = (_last * 100) / this._mSize;
                        Console.Clear();
                        Console.WriteLine(percent + "%");
                        Thread.Sleep(2500);
                }
     
            }
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  7. #7
    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

    il est clair que si tu lis octet par octet, ca va te prendre un temps tres important

    Ce que je te conseillerais de faire, c'est de récuperer la taille de ton fichier,
    et ensuite, de le découper en paquet de 1 Mega (par exemple - apres, tu peux faire plus, en fonction des résultats obtenus)...

    Si j'avais à faire une telle méthode, je fournirais un truc du genre ->

    public delegate void OnCopyChunk(int step);

    static class CopyFile
    {
    int CopyFile(string src, string dest, OnCopyChunk tonDelegate);
    void AbortCopy(int copyId);

    public int ChunkSize;
    }

    Ou CopyFile lance une copie en tache de fond avec un identifiant pour la copie et le abort, permettrait d'arreter la copie identifiée par son numéro

    le delegate aurait l'avantage de fournir une méthode vers l'exterieure pour indiquer le pourcentage d'avancement de la copie.

    Le chunkSize pourrait etre la largeur du buffer lu à chaque fois

    Non ?

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

  8. #8
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    CopyFile
    c'est ma fonction de copie ou c'est une fonction system ??

    par contre je ne comprend pas comment faire un abort avec l'id ??
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  9. #9
    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
    Re

    Tiens , cadeau

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

  10. #10
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Super merci bcp Mr !!
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  11. #11
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    il est clair que si tu lis octet par octet, ca va te prendre un temps tres important

    Ce que je te conseillerais de faire, c'est de récuperer la taille de ton fichier,
    et ensuite, de le découper en paquet de 1 Mega (par exemple - apres, tu peux faire plus, en fonction des résultats obtenus)...
    Je n'en suis pas sûr. Le facteur de blocage est géré par l'OS. Même en lisant 1 byte, l'OS en lit plus. Au moins le secteur logique du disque (contrainte physique), et sûrement plus de façon à prévoir les lectures suivantes.

    Je vais faire un test rapide et le vérifier; avec Windows il faut toujours s'attendre à des surprises :-)

  12. #12
    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

    je pense que le code que je t'ai filé doit bien fonctionner

    J'ai (pour le fun) rajouter un evenemenet "static" dans la classe static que je t'ai filé dans l'exemple....

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate void OnCopyFinish(int id);
    on rajoute dans le code de la classe statique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static event OnCopyFinish CopyFinish;
    et dans le code de la copy par buffer, on rajoute cela en fin de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (p.Thread.Name != "FIN")
                    {
                        if (CopyFinish != null)
                        {
                            CopyFinish(p.Thread.ManagedThreadId);
                        }
                    }
    Voila , comme cela, tu pourras etre notifier que ta copie (l'evenement fourni l'identifiant correspondant à la copie qui s'est terminée) s'est bien finie...
    (ce qui peut-etre pratique dans certains cas de synchronisation ou autre )

    The Monz, Toulouse

    PS : ca serait bien de rajouter dans le code du File.Open() le fait que tu ouvres le fichier qu'en lecture et que de plus, tu autorises l'access en mode FileShare.Read (ce qui autorisera les autres processes à lire le fichier ou le copier pendant qu'une copie aura lieu
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  13. #13
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Merci beaucoup pour ton aide t'es un boss
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/04/2010, 02h48
  2. Réponses: 2
    Dernier message: 11/01/2010, 15h09
  3. Quel est le meilleur controle pour faire des graph
    Par stdebordeau dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/09/2009, 12h17
  4. Réponses: 4
    Dernier message: 26/09/2008, 13h16
  5. Réponses: 5
    Dernier message: 17/08/2006, 10h10

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