Forum Clubic

Lire un fichier texte de plus de 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…

En particulier, le paramètre lpDistanceToMoveHigh

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 5go ?)…

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 > à 2147483647 et on arrive toujours à lire la suite du fichier? Quand il démarre à zéro je comprend, c’est le début, mais négatifs, c’est quoi? apparement le fichier à la position 2147483647 +1 à 2147483647 +2147483647 ???

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 ce serait sympa. Merci
Edité le 21/12/2011 à 23:02

Pour le côté négatif, vu que sur un architecture 32 bits un entier signé c’est max 2^32-1 (d’où les 2GiO), cela peut expliquer qu’il passe dans les négatifs.

Pour le reste, de ce que j’ai compris, quand tu lui passe un pointeur (donc != NULL), il fait (en gros) une opération sur un nombre 64 bits décomposé en deux nombres 32 bits.

(Par contre, je n’ai pas trop compris comment s’en servir et je ne connais pas trop les API Win, ni en C, ni en C++… Au pire, essaye un compilateur 64 bits :stuck_out_tongue: )
Edité le 21/12/2011 à 23:31

Finalement je viens de comprendre ^^

J’avoue c’était écrit dans leur doc (en petit et au milieu de nulle part :D)…