Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

OUVRIR N'IMPORTE QUEL FICHIER AVEC READFILE (API)


Information sur la source

Catégorie :API Niveau : Débutant Date de création : 15/11/2002 Date de mise à jour : 15/11/2002 14:03:06 Vu : 6 733

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

Description

Essayer de charger en mémoire un fichier qui n'est pas de type texte avec les commandes VB... Binary, Input, Random... rien à faire...
Il faut utiliser l'API ReadFile...
Ainsi, on peut ainsi charger en mémoire un fichier .doc, .xls, .mp3, .avi dans une String VB.

 

Source

  • 'API Fichiers
  • Const MOVEFILE_REPLACE_EXISTING = &H1
  • Const FILE_ATTRIBUTE_TEMPORARY = &H100
  • Const FILE_BEGIN = 0
  • Const FILE_SHARE_READ = &H1
  • Const FILE_SHARE_WRITE = &H2
  • Const CREATE_NEW = 1
  • Const OPEN_EXISTING = 3
  • Const GENERIC_READ = &H80000000
  • Const GENERIC_WRITE = &H40000000
  • Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
  • Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
  • Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  • Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
  • Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
  • '#############################################
  • '# #
  • '# Retourne le contenu du fichier "FileName" sous forme d'une String #
  • '# #
  • '#############################################
  • 'FileName est le chemin absolue du fichier (par exemple : "c:\toto.doc")
  • Public Function OpenFile(ByRef FileName As String) As String
  • Dim hOrgFile As Long
  • Dim nSize As Long
  • Dim Ret As Long
  • Dim i As Long
  • On Error GoTo ErrorHandler
  • hOrgFile = CreateFile(FileName, _
  • GENERIC_READ, _
  • FILE_SHARE_READ Or FILE_SHARE_WRITE, _
  • ByVal 0&, OPEN_EXISTING, 0, 0)
  • 'Taille du fichier
  • nSize = GetFileSize(hOrgFile, 0)
  • 'Initialise le pointeur sur le fichier
  • SetFilePointer hOrgFile, 0, 0, FILE_BEGIN
  • OpenFile = Space(nSize)
  • 'Charge le contenu du fichier dans la variable Openfile
  • ReadFile hOrgFile, ByVal OpenFile, nSize, Ret, ByVal 0&
  • 'Ferme le fichier
  • CloseHandle hOrgFile
  • Exit Function
  • ErrorHandler:
  • MsgBox "Impossible de lire le fichier "+FileName ,vbExclamation
  • End Function
'API Fichiers
Const MOVEFILE_REPLACE_EXISTING = &H1
Const FILE_ATTRIBUTE_TEMPORARY = &H100
Const FILE_BEGIN = 0
Const FILE_SHARE_READ = &H1
Const FILE_SHARE_WRITE = &H2
Const CREATE_NEW = 1
Const OPEN_EXISTING = 3
Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000

Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long

Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long



'#############################################
'#                                                                                                  #
'# Retourne le contenu du fichier "FileName"  sous forme d'une String #
'#                                                                                                  #
'#############################################

'FileName est le chemin absolue du fichier (par exemple : "c:\toto.doc")
Public Function OpenFile(ByRef FileName As String) As String
    Dim hOrgFile As Long
    Dim nSize As Long
    Dim Ret As Long
    Dim i As Long
    
    On Error GoTo ErrorHandler
    
    hOrgFile = CreateFile(FileName, _
                            GENERIC_READ, _
                            FILE_SHARE_READ Or FILE_SHARE_WRITE, _
                            ByVal 0&, OPEN_EXISTING, 0, 0)

    'Taille du fichier
    nSize = GetFileSize(hOrgFile, 0)

    'Initialise le pointeur sur le fichier
    SetFilePointer hOrgFile, 0, 0, FILE_BEGIN
    
    OpenFile = Space(nSize)
    
    'Charge le contenu du fichier dans la variable Openfile
    ReadFile hOrgFile, ByVal OpenFile, nSize, Ret, ByVal 0&
     
    'Ferme le fichier
    CloseHandle hOrgFile
    
    Exit Function
ErrorHandler:
    MsgBox "Impossible de lire le fichier "+FileName ,vbExclamation

End Function

Conclusion

Si quelqu'un peut faire un test de vitesse sur un gros fichier texte (au moins 500 Ko) avec l'API ReadFile et avec les méthodes standard VB (Open ... For Input As...) et me tenir au courant des différences de vitesse entre les 2 méthodes.
 

Commentaires et avis

signaler à un administrateur
Commentaire de leptidev le 15/11/2002 14:40:51

Y pas que open .....
y a auss FileSystème Objet (orienté objet)

signaler à un administrateur
Commentaire de jockos le 15/11/2002 15:03:42

C'est vrai, mais alors bonjour la lenteur de FileSystem...
Faudrait faire un testbench pour voir en terme de rapidité ce qu'il y a de mieux...

signaler à un administrateur
Commentaire de hvb le 15/11/2002 22:41:35

ah bon on ne sait pas ouvrir autre chose que du texte avec le open de vb.........?
tu precises en plus de toutes les manieres, et tu cites l'accés binaire.
revois le texte d'intro de ta source, je crois qu'il est erroné...

signaler à un administrateur
Commentaire de jockos le 16/11/2002 01:35:17

Essai d'ouvrir un fichier Mp3 par exemple avec VB en le chargeant dans une String... Je dis que tu prennes l'accès Binaire (Binary),séquentiel(Input, Output, Append) ou aléatoire(Random), rien ne marche pour les fichiers non texte.

Il y a soit l'objet FileSystem ou les API Windows (ReadFile)...

signaler à un administrateur
Commentaire de Crazyht le 16/11/2002 01:58:34 administrateur CS

C bien mais si je fait open sur un fichier de 700 Mo ma memoire va^pas aimer :(((((

signaler à un administrateur
Commentaire de jockos le 16/11/2002 08:46:53

ça c'est mon autre gros problème... Avec VB, pas de Swap j'ai l'impression... il utilise donc seulement la mémoire vive et non celle du disque dur réservé par Windows (mémoire virtuelle).

Word arrive à se dépatouiller avec des gros fichiers, parce qu'il swap une partie de son contenu dans la mémoire virtuelle (disque dur).
Or je n'arrive pas à faire cela en VB...

signaler à un administrateur
Commentaire de celiphane le 23/07/2003 17:04:24

Heu, j'avais jamais vu cette source jockos, mais ceci ouvre et récupère bien les octets d'un fichiers, quelqu'il soit :

dim Ch as string * 1024
open MonFichier for binary as #1
get #1,,Ch
close #1

et hop Ch est remplit contient les 1024 premiers caractères de MonFichier !

Pour faire avec des longueurs variables :

dim Ch as string
open MonFichier for binary as #1
Ch=space(Longueur_a_recuperer)
get #1,,Ch
close #1


En revanche, je ne connaissais pas ReadFile, échange de bon procédé ;) !

@+
Celiphane

signaler à un administrateur
Commentaire de Hobby le 30/09/2003 19:44:33

Salut j'ai fait le test entre ReadFile et fso:
Sur la même machine, avec le même fichier: impossible de faire un test avec un fichier de 500K, j'ai fait le test sur 43Mb (c'est justement le fichier que je doit traité).

ReadFile= 2 secondes
Fso = 3 secondes

a+
Olivier

signaler à un administrateur
Commentaire de jockos le 30/09/2003 20:01:53

Merci pour l'infos...

De toute manière, Fso doit lui même utiliser l'API ReadFile.

Pour écrire un fichier, il y a l'API WriteFile.

Je vais mettre ma source la dessus...

A+

signaler à un administrateur
Commentaire de ld40 le 01/01/2004 19:30:50

ce module mérite d'être mieux connu.
(Quant on sait qu'il repond à l'éternelle question: "comment lire les gros fichiers en vb").

merci.

signaler à un administrateur
Commentaire de merline le 03/02/2005 09:10:49

Merci beaucoup pour cette source ! Pas seulement pour le pb des gros fichiers à ouvrir mais avec le "Line Input", certains charactères sont considérés comme la signalisation de fin de fichier mais là, c impeccable ! merci beaucoup.

signaler à un administrateur
Commentaire de ciberrique le 19/02/2005 12:58:21

N'importe quoi, avec un open et un get tu récupéres se que tu veux ...

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.