Ecrire dans un fichier binaire de plus de 2 Go

Résolu
cs_youyou40
Messages postés
65
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
28 avril 2022
- 18 juil. 2009 à 17:12
Mayzz
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
- 18 juil. 2009 à 22:22
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

Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
18 juil. 2009 à 18:14
utilises les APIs Windows, tu n'auras surement plus ce souci

CreateFile, WriteFile...

Renfield - Admin CodeS-SourceS - MVP Visual Basic
3
cs_ghuysmans99
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
16
18 juil. 2009 à 22:02
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
3
cs_youyou40
Messages postés
65
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
28 avril 2022

18 juil. 2009 à 20:52
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
0
Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
18 juil. 2009 à 22:11
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_youyou40
Messages postés
65
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
28 avril 2022

18 juil. 2009 à 22:21
Merci encore à tous les deux.
Je commence à y voir plus clair avec ces APIs.
0
Mayzz
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
30
18 juil. 2009 à 22:22
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.
0