Ecrire dans un fichier binaire de plus de 2 Go [Résolu]

Signaler
Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017
-
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
-
Bonjour
J'écris une petite application qui travaille sur des fichiers pouvant être très gros.
J'utilise l'instruction Put pour écrire dans ces fichiers, mais elle est limitée à 2 Go.

Comment écrire dans un très gros fichier binaire à un offset supérieur à 2^31 ?

6 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
utilises les APIs Windows, tu n'auras surement plus ce souci

CreateFile, WriteFile...

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Voilà les définitions VB6 de ces APIs ...
Je t'explique en gros comment tu dois procéder :
Tu ouvres un handle via CreateFile, qui permet de créer et/ou ouvrir un fichier.
Maintenant que tu as ce handle, tu peux utiliser les autres APIs de fichiers : ReadFile, WriteFile, SetFilePointer et GetFileSize (y'en a d'autres, je ne te mets que les principales)
Une fois que tu n'as plus besoin de ce fichier, tu le fermes via CloseHandle.

Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function WriteFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, ByRef lpNumberOfBytesWritten As Long, ByRef lpOverlapped As OVERLAPPED) As Long
Private Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByRef lpOverlapped As OVERLAPPED) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function GetFileSize Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpFileSizeHigh As Long) As Long
Private Declare Function SetFilePointer Lib "kernel32.dll" (ByVal hFile As Long, ByVal lDistanceToMove As Long, ByRef lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long


Si tu as besoin d'autres choses, utilise MSDN (documentation des fonctions de Windows) et ApiViewer 2004 (contient la plupart des déclarations de l'API)

---
VB.NET is good ... VB6 is better
Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017

Merci Renfield pour ta réponse.

Je ne pose pas souvent de question sur le forum, mais presque à chaque fois, c'est toi qui me réponds et toujours de façon très pertinente !!!

J'avais pensé à ces APIs (avec SetFilePointer , GetFileSize etc...) mais j'espérais une solution miracle rapide et simple pour ne pas réécrire une partie de mon appli ... qui fonctionne bien mais bloque évidemment pour des fichiers de plus de 2Go.

Merci encore, je vais potasser ces APIs

Michel
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
VB6 a été conçu y'a quelques années. Il découle de la belle epoque du FAT16... du coup, limite de 2Go ^^

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017

Merci encore à tous les deux.
Je commence à y voir plus clair avec ces APIs.
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
27
Pour éviter de te casser la tête, tu peux écrire une classe d'acces IO au disque avec ces API, de cette façon tu n'aura pas à jouer avec les handle et cie pour chaque ouverture de fichier.

++

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.