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 :

[VB6]Lire un gros fichier (2go+) avec SetFilePointer


Sujet :

VB 6 et antérieur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 11
    Points : 9
    Points
    9
    Par défaut [VB6]Lire un gros fichier (2go+) avec SetFilePointer
    Bonjour,

    Y aurait il quelqu'un qui peut m'expliquer en français comment fonctione la fonction SetFilePointer?
    Ce serait que pour faire de la lecture de fichier.


    source : msdn.microsoft.com...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DWORD WINAPI SetFilePointer(
      __in         HANDLE hFile,
      __in         LONG lDistanceToMove,
      __inout_opt  PLONG lpDistanceToMoveHigh,
      __in         DWORD dwMoveMethod
    );
    En particulier, le paramètre lpDistanceToMoveHigh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lpDistanceToMoveHigh [in, out, optional]
     
        A pointer to the high order 32-bits of the signed 64-bit distance to move.
     
        If you do not need the high order 32-bits, this pointer must be set to NULL.
     
        When not NULL, this parameter also receives the high order DWORD of the new value of the file pointer. For more information, see the Remarks section in this topic.
    En fouillant un peu j'ai trouvé à peu près comment elle fonctionne si lpDistanceToMoveHigh=0(null). Càd pour les fichiers de taille limité (environ 2go si je me rappelle)
    Elle a un comportement plutôt classique à la get ou put.

    Moi j'ai besoin de traité un fichier 3go voir 4go

    J'ai trouvé sur le net une fonction qui manipule SetFilePointer avec lpDistanceToMoveHigh<>null (pour lire les gros fichier) mais je ne comprend pas sa logique du tout
    Car au départ il lit disons de façon "normal", puis après avoir testé si la position lDistanceToMove était supérieur à une limite, il repart sur un lDistanceToMove négatif... Quant à lpDistanceToMoveHigh, sa fonction ne prévoit de la modifier que bien plus au delà d'une certaine valeur (cçd un fichier de 4go ?)....

    J'ai été un peu largué sur la compréhension de ce paramètre

    voici le lien du forum : www.vbforums.com...

    Et le code qui m'interesse en particulier la procédure Size2Long:
    pourquoi longlow devient négatif après que FileSize soit > à sa limite 2147483647 et on arrive toujours à lire la suite du fichier? Quand il démarre à zéro avec la position qui augmente je comprend, c'est le début, mais négatifs, c'est quoi? apparement le fichier à la position 2147483647 +1 à 2147483647 +2147483647 ????
    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
    Private Sub Size2Long(ByVal FileSize As Currency, ByRef LongLow As Long, ByRef LongHigh As Long)
    '&HFFFFFFFF unsigned = 4294967295
    Dim Cutoff As Currency
    Cutoff = 2147483647
    Cutoff = Cutoff + 2147483647
    Cutoff = Cutoff + 1 ' now we hold the value of 4294967295 and not -1
    LongHigh = 0
    Do Until FileSize < Cutoff  
        LongHigh = LongHigh + 1
        FileSize = FileSize - Cutoff
    Loop
    If FileSize > 2147483647 Then 
        LongLow = -CLng(Cutoff - (FileSize - 1))
    Else
        LongLow = CLng(FileSize)
    End If
    End Sub
    
    Public Sub API_ReadFile(ByVal FileNumber As Long, ByVal Position As Currency, ByRef BlockSize As Long, ByRef Data() As Byte)
    Dim PosL As Long
    Dim PosH As Long
    Dim SizeRead As Long
    Dim Ret As Long
    Size2Long Position, PosL, PosH
    Ret = SetFilePointer(FileNumber, PosL, PosH, FILE_BEGIN)
    Ret = ReadFile(FileNumber, Data(0), BlockSize, SizeRead, 0&)
    BlockSize = SizeRead
    End Sub
    Au final j'ai adapter ma fonction de lecture à sa fonction Size2Long sans comprendre comment en se positionnant en négatif il arrive à lire la continuité du fichier... Ca marche mais j'aimerais comprendre son fonctionnement
    Donc si quelqu'un pouvait m'expliquer et en français ce serait sympa. Merci

  2. #2
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 165
    Points
    1 165
    Par défaut
    J'y connais rien à ton truc, mais j'ai une explication ....
    Un entier long en V6 varie de -2 147 483 648 à +2 147 483 647 car il est considéré comme signé
    Par contre, ta fonction doit le considérer comme non signé et il représente alors une position de 0 à 4 294 967 295

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Je crois que je commence à comprendre....

    En réalité il faut penser binaire. C'est malin. C'est compliqué mais malin

  4. #4
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 165
    Points
    1 165
    Par défaut
    Citation Envoyé par MicMac81 Voir le message
    En réalité il faut penser binaire.
    non signé
    En effet un pointeur négatif sur une position absolue dans un fichier .... ça sert à rien

Discussions similaires

  1. Peut-on lire de gros fichiers avec un JTextPane ?
    Par Beginner. dans le forum Débuter
    Réponses: 2
    Dernier message: 15/05/2015, 00h00
  2. Lire DANS un fichier wav avec VBA
    Par SwissEngineer dans le forum Général VBA
    Réponses: 7
    Dernier message: 01/12/2006, 16h56
  3. [XML]lire un gros fichier de format xml et l'envoyer
    Par diamonds dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 17/10/2006, 15h33
  4. Transformer un très gros fichier XML avec XSL
    Par wozzz dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 30/05/2006, 10h57
  5. Peut-on lire des gros fichiers(100k) avec "TClientSocke
    Par Fred LEM dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/12/2004, 14h41

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