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 6 et antérieur Discussion :

lecture de fichier fixe de plus de 2Go


Sujet :

VB 6 et antérieur

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 34
    Points : 33
    Points
    33
    Par défaut lecture de fichier fixe de plus de 2Go
    Bonjour,

    j'ai un petit souci avec un vieux programme en VB6, je lis un fichier avec des lignes de longueur fixe (sans caractère de fin de ligne) et j'utilise la fonction LOF pour calculer le nombre d'enregistrement à traiter dans une boucle For, mais ça ne fonctionne plus avec des fichiers de plus de 2Go (exemple pour un fichier de 2,3Go LOF renvoi un nombre négatif ...), exemple de code
    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
    Type FicIn
        enr as string*400
    end type
     
    Dim Fic as string
    Dim Enr0 as Ficin
     
        Fic = "<chemin du fichier>"
        Open Fic For Random as #1 Len=len(Enr0)
        nbEnr = LOF(1) / Len(Enr0)
        For nEnr=1 To nbEnr
            ...
            GET #1,nEnr,Enr0
            traitement de chaque enregistrement Enr0
            ...
        Next nEnr
        Close
    Existe-t-il une méthode simple pour mettre à jour le programme (en restant en VB6) pour remplacer la fonction LOF et garantir que le GET continuera de fonctionner au delà des 2Go ?

    Merci de votre retour
    Alain

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonsoir,
    VB6 étant 32bits, quasi toutes les limitations découlent de la limite des 4 octets signés (2^31-1)
    soit 2147483647.
    C'est le cas des limites de tableaux, de string, de lecture d'un long.
    L'astuce consiste donc à lire le fichier par fragment via les api
    ou plus simplement en utilisant la librairie VB6i (http://vb6i.com/#File_Methods.htm)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Merci pour ton retour
    En fait j'ai testé une autre méthode qui fonctionne avec VB6 de base : fso

    voici un code qui fonctionne sans être gêné par la limite des 2 Go :
    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
    Type EnrIn
        codeEnr As String * 2
        compte As String * 8
        detail As String * 300
    End Type
    Type EnrIn0
        data As String * 400
    End Type
     
    Private Sub Lecture()
    Dim x
    Dim fic As String
    Dim fso As New FileSystemObject
    Dim f As File, s As Long
    Dim nbenr As Long
    Dim Enr As EnrIn
    Dim Enr0 As EnrIn0
    Dim TS As TextStream
     
        fic = "<monFichier>"
        x = CDec(0)
        Set f = fso.GetFile(fic)
        x = f.Size
        nbenr = x / 400
        Set TS = fso.OpenTextFile(fic, ForReading)
        For nenr = 1 To nbenr
            Enr0.data = TS.Read(Len(Enr))
            LSet Enr = Enr0
        Next
        Close
    End Sub
    Donc pour la taille du fichier, l'objet fso possède la méthode size qui gêre au delà des 2Go => ce qui remplace la fonction LOF
    La commande open est remplacée par fso.opentextFile, le handle n'est plus numérique => la commande get ne fonctionne plus, mais la méthode Read sur le Handle avec une longueur correspond.
    La différence est que le résultat du READ ne peut pas être affecté directement une variable de type structure, j'ai dû passer par une structure intermédiaire.

    Mais au résultat ça fonctionne correctement avec le fichier de 2,7 Go

    Merci
    Alain

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour

    Es-tu certain, si cette appli doit être déployée, que VBS sera autorisé sur toutes les machines clientes ? D'aucuns ont décidé de l'inhiber.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Le filesystemobject rame à mort. Pour les traitements lourds, ce n'est pas la panacée.

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

Discussions similaires

  1. Lecture de fichiers de plus de 4Go
    Par nulloz dans le forum Linux
    Réponses: 8
    Dernier message: 07/10/2008, 22h18
  2. Réponses: 4
    Dernier message: 13/11/2007, 10h10
  3. Réponses: 50
    Dernier message: 19/10/2007, 23h38
  4. lecture de fichier de plus de 3000 lignes
    Par muslem dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 08/06/2007, 12h22
  5. TFileStream et les fichiers de plus de 2Go
    Par naikon dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/06/2004, 16h11

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