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 :

Lecture d'un gros fichier


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut Lecture d'un gros fichier
    Bonjour à tous,

    J'essai tant bien que mal d'afficher une barre de progression pendant la lecture d'un fichier. J'utilise donc un thread avec des délégués pour définir la valeur maximum de la barre de progression, et afficher la progression pendant la lecture.

    Le seul problème (qui peut paraître simple surement à vos yeux) et que je n'arrive pas à définir la valeur maximale de la barre de progression, j'ai soit des dépassement de capacité, soit une valeur trop grande...

    Voici le code de mon thread :

    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
     
                Dim lProcessedLength As Long = 0
                Dim fileLength As Long = 0
                Dim iProgressValue As Long = 0
                Using fs As FileStream = File.Open("C:\fichier.iso", FileMode.Open, FileAccess.ReadWrite)
                    fileLength = fs.Length
                    Using bs As BufferedStream = New BufferedStream(fs)
                        Using sr As StreamReader = New StreamReader(bs)
                            Dim ligne As String = ""
                            ligne = sr.ReadLine
                            lProcessedLength += ligne.Length
                            iProgressValue = Convert.ToInt32((lProcessedLength / fileLength) * 100)
                            tdlg.ShowProgressPercent(iProgressValue)
                            While ligne IsNot Nothing
                                If cancel = True Then
                                    Exit Sub
                                End If
                                lProcessedLength += ligne.Length
                                ' get the percent of the file that we have completed...
                                iProgressValue = Convert.ToInt32((lProcessedLength / fileLength) * 100)
                                tdlg.ShowProgressPercent(iProgressValue)
                                ligne = sr.ReadLine
                            End While
                            sr.Close()
                            sr.Dispose()
                        End Using
                        bs.Close()
                        bs.Dispose()
                    End Using
                    fs.Close()
                    fs.Dispose()
                End Using
    Dans ce code, j'ai directement mis la taille du fichier dans la mise à jour de la valeur maximale de la barre de progression (fichier de 4Go) Et le File.lentgh provoque un dépassement de capacité.

    Pouvez vous m'aidez s'il vous plait ?

    Merci à tous !

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,

    Plusieurs choses clochent dans ce code :
    - La lecture des lignes (ligne = sr.ReadLine) est en dehors de la boucle : La boucle ne fait qu'incrémenter la ProgressBar ??!
    - La variable lProcessedLength n'est pas utilisée : La ProgressBar est incrémenté de 1 à chaque boucle et non pas en fonction de lProcessedLength ...

    Concernant la valeur max de la ProgressBar, si le fichier peut atteindre 4Go (ça va être long comme traitement !!!) ça va dépasser. Il va falloir utiliser une méthode pour calculer la valeur de progression de la ProgressBar et sa valeur max afin qu'elles soient proportionnelles à la progression de lecture et à la taille du fichier (type pourcentage).

    eb.

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    tu peux mettre le progressbar.maximum à une valeur autre que la taille du fichier et faire un produit en crois pour trouver la valeur à y mettre

    si le progressbar fait 300 pixels de long, mettre 300 en max a un sens dans le sens ou faire avancer de 1 fait avancer d'un pixel (alors que sur 4 millions faire avancer de 1 ne fait pas avancer du tout le progressbar)
    tu peux aussi gérer en pourcentage et mettre 100 dans max (ca sera quand même moins fin)
    et si tu ne veux t'embeter à gérer le nombre de pixels tu mets arbitrairement 1000 dans max, ca sera fin et simple à calculer

    après tu connais le nombre d'octets du fichier et tu connais le nombre d'octets lus
    enfin toi tu lis des lignes, mais le nombre d'octets peut en etre déduis

    et sinon mettre à jour le progressbar à chaque ligne est une perte de temps, donc surement une perte de performance, le faire toutes les x lignes suffit
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut
    Merci pour vos réponses, j'ai donc modifier la lecture des lignes à l'intérieur de la boucle (c'est vrai que sinon c'était un peu nul comme code ) et j'ai essayer de calculer la progression; J'ai donc ceci :

    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
     
    Dim lProcessedLength As Long = 0
                Dim fileLength As Long = 0
                Using fs As FileStream = File.Open("C:\fichier.iso", FileMode.Open, FileAccess.ReadWrite)
                    fileLength = fs.Length
                    Using bs As BufferedStream = New BufferedStream(fs)
                        Using sr As StreamReader = New StreamReader(bs)
                            Dim ligne As String = ""
                            ligne = sr.ReadLine
                            While ligne IsNot Nothing
                                If cancel = True Then
                                    Exit Sub
                                End If
                                lProcessedLength += ligne.Length
                                ' get the percent of the file that we have completed...
                                Dim iProgressValue As Integer = Convert.ToInt32((lProcessedLength / fileLength) * 100)
                                tdlg.ShowProgressPercent(iProgressValue)
                                ligne = sr.ReadLine
                            End While
                            sr.Close()
                            sr.Dispose()
                        End Using
                        bs.Close()
                        bs.Dispose()
                    End Using
                    fs.Close()
                    fs.Dispose()
                End Using
    Mais le traitement se termine avec une barre remplie à 94%, ai-je oublié quelque chose ?

    Merci encore !

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut
    Désolé post en double problème d'envoi de formulaire...

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    pas regardé le code mais tu as surement oublié de faire +2 à chaque ligne (un saut de ligne c'est 2 caractères, et vu que tu découpes par ligne ils sont supprimés te ta chaine de caractère)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Et je reviens sur ce que disait Pol63 :
    mettre à jour le progressbar à chaque ligne est une perte de temps, donc surement une perte de performance, le faire toutes les x lignes suffit
    Donc, pour gagner en perf, calculer le pourcentage toutes les x lignes et appeler tdlg.ShowProgressPercent uniquement si ce poucentage est réellement modifié ...

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Par défaut
    Pol63, même résultat en ajoutant +2 a chaque ligne... Se termine a 94%

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

Discussions similaires

  1. [XPATH 1.0] Temps de lecture d'un "gros" fichier XML
    Par Ikki_2504 dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 14/01/2011, 18h27
  2. [XML] Lecture d'assez gros fichiers XML
    Par jeronimo83 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 19/02/2010, 18h26
  3. Optimiser lecture d'un gros fichier
    Par n8ken dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 17/09/2009, 11h14
  4. Lecture d'un gros fichier (jusqu a 300 Mo)
    Par Tidus159 dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 10/04/2009, 16h57
  5. Optimisation de la lecture de tres gros fichiers
    Par Lydie dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/07/2004, 14h09

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