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

Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017
- - Dernière réponse : Mayzz
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2013
- 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 ?
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
3
Merci
utilises les APIs Windows, tu n'auras surement plus ce souci

CreateFile, WriteFile...

Renfield - Admin CodeS-SourceS - MVP Visual Basic

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 189 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Renfield
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 189 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_ghuysmans99
Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017
0
Merci
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
Commenter la réponse de cs_youyou40
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57
0
Merci
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
Commenter la réponse de Renfield
Messages postés
58
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
3 janvier 2017
0
Merci
Merci encore à tous les deux.
Je commence à y voir plus clair avec ces APIs.
Commenter la réponse de cs_youyou40
Messages postés
2859
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2013
16
0
Merci
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.
Commenter la réponse de Mayzz