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

VB.NET Discussion :

Pourcentage copy d'un fichier de 20GB [VB.Net]


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut Pourcentage copy d'un fichier de 20GB [VB.Net]
    Bonjour à tous,

    Déjà , je ne sais pas si je poste au bon endroit

    Ensuite mon probleme est dans le titre: j'aimerais avoir le pourcentage de la copy sur mon fichier de 20GB.

    Quand je lance la copie via mon programme, la destination fait la même taille que la source même si la copie met 15 min à se terminer, je ne peux donc pas faire "taille source" - "taille dest" pour ma progressbar

    j'utilise la methode suivante pour la copie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.IO.File.Copy(source, Dest)
    J'ai pu voir qu'il existait plusieurs méthodes pour copier par "byte" mais je comprend pas très bien comment elle fonctionne (je débute).

    Faut-il que je m'oriente vers la copie par "byte" ou d'autre méthodes sont plus appropriées ?

    Merci de vos réponse

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Bon, j'ai réussi à avancer petit à petit

    J'arrive à copier mon fichier avec la barre de progression grace à readByte() et writeByte mais cela me prend un temps un fou !!!

    Possibilité de copier paquet de byte, par exemple paquet de 1000 byte ? JE gagnerais du temps de copie ?

  3. #3
    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 : 44
    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 pISQUIK Voir le message
    J'arrive à copier mon fichier avec la barre de progression grace à readByte() et writeByte mais cela me prend un temps un fou !!!
    Tu m'étonnes

    Il y a une API Windows qui permet de copier des fichiers en ayant un retour sur la progression de la copie : CopyFileEx

    C'est un peu galère à utiliser directement, mais la lib Dvp.NET contient un wrapper .NET que tu peux utiliser comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Import Developpez.Dotnet.System
     
    ...
     
        Dim copy As New FileCopyOperation(sourcePath, destinationPath)
        AddHandler copy.ProgressChanged, AddressOf(OnCopyProgress)
        copy.Execute()
     
    ...
     
    Sub OnCopyProgress(ByVal sender As Object, ByVal e As FileOperationProgressEventArgs)
        progressBar.Value = e.PercentDone
    End Sub

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Autre alternative : passer par le shell qui affiche les panneaux de progression standard de Windows.
    voir http://dotnet-snippets.com/dns/filec...ue-SID588.aspx

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Merci de vos réponses,

    J'ai réussis à m'en sortir mais je ne sais pas si c'est vraiment très académique comme code

    Pour ceux que ca intéresse voila ma fonction :

    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
     
     Sub copyFile2()
     
            Dim _fileStreamOrignal = New FileStream(input, FileMode.Open, FileAccess.Read)
            Dim _fileStreamDestination = New FileStream(output, FileMode.Create, FileAccess.Write)
            Dim brReader = New BinaryReader(_fileStreamOrignal)
            Dim brWriter = New BinaryWriter(_fileStreamDestination)
            Dim octets = _fileStreamOrignal.Length
            Dim count As Integer = 10000000
            Dim buffer(count) As Byte
            Dim bytesRead As Integer
            Dim boucle As Integer = 0
     
            Try
                While octets > 0
                    bytesRead = brReader.Read(buffer, 0, count)
                    If bytesRead = 0 Then
                        Exit While
                    End If
     
                    brWriter.Write(buffer, 0, bytesRead)
                    octets = octets - bytesRead
                    boucle = boucle + 1
                    BackgroundWorker1.ReportProgress(boucle)
     
                End While
            Catch ex As Exception
                MsgBox("error")
            End Try
     
            MsgBox(boucle)
     
            brReader.Close()
            brWriter.Close()
            _fileStreamDestination.Close()
            _fileStreamOrignal.Close()
     
        End Sub
    Suivant le "count" utilisé on utilise de plus ou moins gros "paquets" de bytes.

    Voila, si quelqu'un à des remarques ou autres n'hesitez pas

    A+

  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 : 44
    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 pISQUIK Voir le message
    Merci de vos réponses
    Pourtant elles ne t'ont visiblement pas beaucoup inspiré

    Pourquoi réinventer la roue alors qu'il existe des trucs faits exprès ?

    Citation Envoyé par pISQUIK Voir le message
    J'ai réussis à m'en sortir mais je ne sais pas si c'est vraiment très académique comme code
    Bah c'est une technique classique en fait... mais en général on utilise pas un buffer aussi gros, les tailles les plus fréquemment utilisées sont 4096 ou 8192.

  7. #7
    Membre éclairé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 246
    Par défaut
    Je trouve aussi que le streamWriter est plus pratique le File.copy qui est plus util pour les petits fichiers, en plus avec le streamwriter, tu peux faire une pause sur la copie. Mais comme dit juste au-dessus, tataile de buffer est trop grosse, imagine s'il y a un plantage, tu auras une grosse perte à mon avis et tu surcharge la mémoire.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    J'utilise cette taille de buffer parce que j'ai l'impression que ca copie plus vite, peut etre que je me trompe Il faut que je chronometre.

    Je vais me pencher sur le streamWriter car la pause m'interesse grandement !

    En parlant de pause, est-il possible de stopper un background worker et de le relancer sur l'action en cours ?

  9. #9
    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 : 44
    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 pISQUIK Voir le message
    J'utilise cette taille de buffer parce que j'ai l'impression que ca copie plus vite, peut etre que je me trompe Il faut que je chronometre.
    Fais des tests de perf si tu veux, mais je pense pas que ce soit plus rapide... si on utilise habituellement une taille de 4096, c'est parce que ça correspond à la taille d'un secteur du disque, et que c'est donc a priori une taille optimale

    Citation Envoyé par pISQUIK Voir le message
    Je vais me pencher sur le streamWriter car la pause m'interesse grandement !
    C'est totalement inadapté... un StreamWriter, c'est pour écrire du texte, pas des données binaires arbitraires.

    Et en fait, les BinaryReader/BinaryWriter que tu utilises dans ton code ne sont pas utiles, tu pourrais utiliser directement les Stream

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 209
    Par défaut
    Il y a aussi ce CopyFile même si c'est le mal

    Je vais aller me repentir

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Il y a aussi ce CopyFile même si c'est le mal
    Ouaip j'ai essayé, mais pour le pourcentage de copie ça ne marche pas car ça copie tout d'un bloc ce qui me donne la barre de progression soit vide, soit pleine :s

    Et en fait, les BinaryReader/BinaryWriter que tu utilises dans ton code ne sont pas utiles, tu pourrais utiliser directement les Stream
    En effet ils ne me servent à rien, je les ai enlevés


    ---------------------------------------------------------------
    Résultats des tests de copie sur fichier de 546 609 Ko, calcul de la moyenne sur 3 copies :

    Buffer 4096 -> Moyenne de temps 60 sec de copie
    Buffer 10 000 -> Moyenne de temps 55 sec de copie
    Buffer 100 000 -> Moyenne de temps 40 sec de copie
    Buffer 10 000 000 -> Moyenne de temps 25 sec de copie

    VoiliVoilou pour le timing, niveau mémoire plus il y a un gros buffer plus ça bouffe..

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 209
    Par défaut
    Citation Envoyé par pISQUIK Voir le message
    Ouaip j'ai essayé, mais pour le pourcentage de copie ça ne marche pas car ça copie tout d'un bloc ce qui me donne la barre de progression soit vide, soit pleine :s
    Bizarre j'ai lu un commentaire qui disait qu'il fallait un gros fichier pour que ca marche sinon ca allait trop vite mais bon j'ai jamais testé donc

  13. #13
    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 : 44
    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 pISQUIK Voir le message
    Buffer 4096 -> Moyenne de temps 60 sec de copie
    Buffer 10 000 -> Moyenne de temps 55 sec de copie
    Buffer 100 000 -> Moyenne de temps 40 sec de copie
    Buffer 10 000 000 -> Moyenne de temps 25 sec de copie

    VoiliVoilou pour le timing, niveau mémoire plus il y a un gros buffer plus ça bouffe..
    OK ! bah c'est bon à savoir...

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Bizarre j'ai lu un commentaire qui disait qu'il fallait un gros fichier pour que ca marche sinon ca allait trop vite mais bon j'ai jamais testé donc
    En effet en cherchant un peu plus sur le copyFIle j'ai pu copier mon gros fichier avec la barre de progression windows (comme si on faisait copier/coller)

    Ca peut être pas mal mais pour m'on appli, c'est pas terrible une fenêtre windows qui s'ouvre sur ma fenetre vb toute jolie et durement travaillée

    Voila ma fonction, au passage copie rapide : 20sec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Sub copyFile3()
     
            Dim instance As UIOption = UIOption.AllDialogs
            My.Computer.FileSystem.CopyFile(input, output, instance)
     
        End Sub
    Petite question, est-ce possible de rajouter des boutons sur les formes windows ?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Autre petite question par rapport au fenêtre d'origine Windows (je sais pas si je dois les appelé comme ca ou pas):
    Est-ce possible de les imbriquer dans les fenêtres de l'application et qu'elles ne se lancent pas par dessus?

    J'en demande peut etre un peu trop la

  16. #16
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 209
    Par défaut
    Tu as un CopyFile avec 4 arguments pour ajouter un bouton cancel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            My.Computer.FileSystem.CopyFile(input, output, UIOption.AllDialogs)
    C'est plus joli :p

    Pour le reste aucune idée, mais si j'ai bien compris l'idée, ca fait appel à l'OS donc j'ai un doute que tu aies le control sur la fênetre.
    Si tu veux faire ca il faut utiliser la proposition de tomlev #3

  17. #17
    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 : 44
    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 pISQUIK Voir le message
    Petite question, est-ce possible de rajouter des boutons sur les formes windows ?
    Tu veux dire sur les dialogues natifs de Windows ? C'est possible pour certains (par exemple OpenFileDialog), mais c'est pas facile du tout, il faut bidouiller avec l'interop Win32...

    Citation Envoyé par pISQUIK Voir le message
    Autre petite question par rapport au fenêtre d'origine Windows (je sais pas si je dois les appelé comme ca ou pas):
    Est-ce possible de les imbriquer dans les fenêtres de l'application et qu'elles ne se lancent pas par dessus?
    Oui, mais je suis pas sûr que ça donne le résultat escompté... Et puis il faut connaitre le handle de la fenêtre, ce qui n'est pas évident non plus.
    Une fois que tu as le handle, il faut mettre le dialogue comme enfant de ta fenêtre avec la fonction Win32 SetParent

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Bon le week end est passé par la donc j'ai pas pu répondre avant mais merci de vos infos !

    D'après vos réponse c'est compliquer de gérer les fenêtres native de windows donc je vais m’arrêter à ma petite barre de progression

    Mais avant de partir et de vous laisser tranquille, j'aimerais savoir (si c'est possible) comment faire pour pouvoir faire une pause sur la copie ? Car un fichier de 20GO à copier c'est long et l'utilisateur risque de s'impatienter

    J'utilise déjà ma "copy()" à l’intérieur d'un BGW pour éviter de bloquer toute l'appli lors de la copie.

  19. #19
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 209
    Par défaut
    cf post #3
    si tu veux des trucs plus élaboré il faut utilisé l'Api Windows (facilité via la bibliothèque de dvp.com)

  20. #20
    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 : 44
    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 pISQUIK Voir le message
    Mais avant de partir et de vous laisser tranquille, j'aimerais savoir (si c'est possible) comment faire pour pouvoir faire une pause sur la copie ? Car un fichier de 20GO à copier c'est long et l'utilisateur risque de s'impatienter
    Si tu utilises la classe FileCopyOperation mentionnée dans le post #3 : une solution serait de bloquer le thread courant dans le handler de l'évènement ProgressChanged, en utilisant un WaitHandle par exemple...

    D'ailleurs ce serait une fonctionnalité intéressante à ajouter dans la classe...

Discussions similaires

  1. [VB6] Impact de la copie d'un fichier
    Par Cereal123 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 31/03/2006, 08h57
  2. Réponses: 12
    Dernier message: 07/12/2005, 19h42
  3. copie de base, fichier mdw, perte des droits
    Par hades666evil dans le forum Access
    Réponses: 2
    Dernier message: 14/09/2005, 18h06
  4. Copie d'un fichier sans montage avec Samba
    Par jean-jacques varvenne dans le forum Réseau
    Réponses: 5
    Dernier message: 14/07/2005, 12h31
  5. copie d'un fichier vers un autre serveur
    Par jexl dans le forum ASP
    Réponses: 4
    Dernier message: 20/12/2004, 17h04

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