Classe pour contrôler parfaitement vos fichiers texte à ouvrir

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 110 fois - Téléchargée 27 fois

Contenu du snippet

C'est une très bonne classe pour ouvrir des fichiers. Elle est assez simple d'utilisation par rapport à ce quelle peut faire. Elle peut :

-Ouvrir des fichier
-En spécifier la disposition (écraser si existe, créer si absent, ouvrir seulement, ouvrir ou créer...)
-Se déplacer à son aise dans un fichier
-"Patcher" les zones vouluent
-Lire les données et les envoyers directements à la variable (pas de "=")
-Donner la position du curseur dans le fichier
-Elle donne la taille du ficher, le handle
-Pas besoins de la redéclarer. Fermez le fichier pi ouvrez en un autre avec la même classe.
-Définitez le mode de partage.

Source / Exemple :


'/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/'=======
'UTILISATION
'=======
'1-Déclarez la classe
dim txt as new textstream

'2-Ouvrez le fichier
txt.OpenOrCreateFile "c:\coolx.txt", Forwritting, OpenOrCreate

'Explication:
'file=Le fichier à ouvrir
'IOmode=Le mode d'ouverture : écriture ou lecture du fichier?
'Disposition=Comme il faut agir?: le fichier doit exister, écraser ou créer le fichier, ...
'ShareMode=Le mode de partage du fichier (laisser comme ça)
'Flags=Options diverses (File_Sequential_Scan peut carrément aide pour la lecture
'de gros fichiers)

'3-Positionez vous dans le fichier (si nécéssaire)
txt.SetPosition File_Current, 5

'Explication:
'StartPosition=À partir de où ce déplacer?
'Distance=Déplacer de combiens?
'POUR OUVRIR UN FICHIER ET SE PLACER À SA FIN, FAÎTES :
TXT.SetPosition

'4-Lecture/Écriture
'Trop simple ...
'Quand c'est "ToBuffer", indiquez la variable STRING dans laquelle il faut aller porter
'les données.

'5-Fermeture
'Simplement txt.closefile

'6-Skipper des caractères/lignes
txt.skip %nb de caractères%

txt.skipline 'saute un ligne
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

'??????????????????????????????????????????????????????????
'Classe TextStream v1.0
'Créer par DeadlyPredator le 8 mai 2004
'JE NE SUIS PAS RESPONSABLE DE TOUT ÉVENTUEL DOMMAGE LIÉE À L'UTILISATION
'DE CETTE SOURCE.
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Option Explicit
'Déclarations {
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 GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh 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 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 WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Public Enum FileFlags
File_No_Buffering = &H20000000
File_Sequential_Scan = &H8000000
File_Random_Access = &H10000000
File_Write_Through = &H80000000
End Enum

Public Enum FilePosition
File_Begin = 0
File_End = 2
File_Current = 1
End Enum

Public Enum FileAccesMode
OpenOrCreate = 4
OpenOnly = 3
CreateOrOverwrite = 2
CreateOnly = 1
End Enum

Public Enum FileIOmode
ForReading = &H80000000
Forwritting = &H40000000
End Enum

Public Enum FileShareMode
ShareRead = &H1
ShareWritting = &H2
ShareBoth = &H3
End Enum
'}

'Propriétés {
Private mHandle As Long
Private mIOmode As Long
Private mShareMode As Long
Private mSize As Long
Private mCurrentPosition As Long

Public Property Get AtEndOfStream() As Boolean
If mCurrentPosition = mSize Then AtEndOfStream = True
End Property

Public Property Get Handle() As Long
If mHandle = -1 Then Handle = 0 Else: Handle = mHandle
End Property

Public Property Get IOmode() As FileIOmode
IOmode = mIOmode
End Property

Public Property Get ShareMode() As FileShareMode
ShareMode = mShareMode
End Property

Public Property Get Size() As Long
Size = mSize
End Property

Public Property Get CurrentPosition() As Long
CurrentPosition = mCurrentPosition
End Property
'}

'Ouverture {
Public Function OpenOrCreateFile(file As String, Optional IOmode As FileIOmode = &H80000000, Optional Disposition As FileAccesMode = 3, Optional ShareMode As FileShareMode = &H3, Optional Flags As FileFlags = 0) As Boolean
mHandle = CreateFile(file, IOmode, ShareMode, 0&, Disposition, Flags, 0)
If mHandle = -1 Then mHandle = 0: Exit Function
mShareMode = ShareMode
mIOmode = IOmode
mSize = GetFileSize(mHandle, 0)
OpenOrCreateFile = True
End Function
'}

'Déplacer le curseur {
Public Sub SetPosition(Optional StartPosition As FilePosition = 2, Optional Distance As Long = 0)
If mHandle = 0 Or Distance < 0 Then Exit Sub
If Distance > mSize And StartPosition = 2 Then Exit Sub
SetFilePointer mHandle, Distance, 0, StartPosition
Select Case StartPosition
Case 0 'b
mCurrentPosition = Distance
Case 1 'c
mCurrentPosition = mCurrentPosition + Distance
Case 2 'e
mCurrentPosition = mSize - Distance
End Select
End Sub
'======================================================
    'Pour skipper {
    Public Sub Skip(Lenght As Long)
    If mHandle = 0 Or mIOmode <> &H80000000 Or mCurrentPosition + Lenght > mSize Then Exit Sub
    SetPosition File_Current, Lenght
    End Sub
    Public Sub SkipLine()
    If mHandle = 0 Or mIOmode <> &H80000000 Then Exit Sub
    Dim FileStep As Integer, CharBuffer As String
    Do Until FileStep = 2 Or mCurrentPosition = mSize
    CharBuffer = "0"
    ReadFile mHandle, ByVal CharBuffer, 1, 0, 0&
    mCurrentPosition = mCurrentPosition + 1
    If CharBuffer = Chr(13) Then FileStep = 1
    If CharBuffer = Chr(10) And FileStep = 1 Then FileStep = 2
    DoEvents
    Loop
    End Sub
    '}
'}

'Lire du texte {
Public Sub ReadDataToBuffer(Buffer As String, Optional Lenght As Long = 1)
If mHandle = 0 Or mIOmode <> &H80000000 Or mCurrentPosition + Lenght > mSize Then Exit Sub
Buffer = String$(Lenght, "0")
ReadFile mHandle, ByVal Buffer, Lenght, 0, 0&
mCurrentPosition = mCurrentPosition + Lenght
End Sub
'======================================================
Public Function ReadData(Optional Lenght As Long = 1) As String
If mHandle = 0 Or mIOmode <> &H80000000 Or mCurrentPosition + Lenght > mSize Then Exit Function
Dim Buffer As String
Buffer = String$(Lenght, "0")
ReadFile mHandle, ByVal Buffer, Lenght, 0, 0&
mCurrentPosition = mCurrentPosition + Lenght
ReadData = Buffer
End Function
'}

'Lire une ligne {
Public Sub ReadLineToBuffer(Buffer As String)
If mHandle = 0 Or mIOmode <> &H80000000 Then Exit Sub
    Dim FileStep As Integer, CharBuffer As String, LineBuffer As String
    Do Until FileStep = 2 Or mCurrentPosition = mSize
    CharBuffer = "0"
    ReadFile mHandle, ByVal CharBuffer, 1, 0, 0&
    LineBuffer = LineBuffer & CharBuffer
    mCurrentPosition = mCurrentPosition + 1
    If CharBuffer = Chr(13) Then FileStep = 1
    If CharBuffer = Chr(10) And FileStep = 1 Then FileStep = 2
    DoEvents
    Loop
    Buffer = LineBuffer
End Sub
'======================================================
Public Function ReadLine() As String
If mHandle = 0 Or mIOmode <> &H80000000 Then Exit Function
    Dim FileStep As Integer, CharBuffer As String, LineBuffer As String
    Do Until FileStep = 2 Or mCurrentPosition = mSize
    CharBuffer = "0"
    ReadFile mHandle, ByVal CharBuffer, 1, 0, 0&
    LineBuffer = LineBuffer & CharBuffer
    mCurrentPosition = mCurrentPosition + 1
    If CharBuffer = Chr(13) Then FileStep = 1
    If CharBuffer = Chr(10) And FileStep = 1 Then FileStep = 2
    DoEvents
    Loop
    ReadLine = LineBuffer
End Function
'}

'Écriture {
Public Sub WriteData(Data As String)
If mHandle = 0 Or mIOmode <> &H40000000 Then Exit Sub
WriteFile mHandle, ByVal Data, Len(Data), 0, 0&
mCurrentPosition = mCurrentPosition + Len(Data)
End Sub
'======================================================
Public Sub WriteLine(Data As String)
If mHandle = 0 Or mIOmode <> &H40000000 Then Exit Sub
Data = Data & vbCrLf
If mHandle = 0 Or mIOmode <> &H40000000 Then Exit Sub
WriteFile mHandle, ByVal Data, Len(Data), 0, 0&
mCurrentPosition = mCurrentPosition + Len(Data)
End Sub

Public Sub WriteBlankLines(Number As Long)
If mHandle = 0 Or mIOmode <> &H40000000 Then Exit Sub
Dim i As Long
For i = 1 To Number
WriteLine ""
Next
End Sub
'}

'Fermeture {
Public Sub CloseFile()
If mHandle <> 0 Then CloseHandle mHandle
End Sub
'}

Private Sub Class_Terminate()
CloseFile
End Sub

Conclusion :


Vos commentaires?

A voir également

Ajouter un commentaire Commentaires
Messages postés
120
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
9 mars 2008

Est-ce que j'ai vu Concept objet en vb 6.
Alors que fait-on de l'héritage de classes
vb 6 n'est pas un langage orienté Objet.

En passant merci pour ta source.
Messages postés
188
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
10 août 2009

je me pose quand meme une question : ou trouve tu les descriptions des API ? tu fais ca au filing avec la visionneuse d'API ou koi???:D
Messages postés
188
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
10 août 2009

bon je viens de regarder ta source que tu m'a conseiller de regarder dans ta nouvelle source...
tu n'a pas l'air d'avoir compris ce que j'avais dit : ici aussi ton fichier n'est ouvert qu'en lecture OU en ecriture donc pas de possibilité pour ecrire ET lire en meme temps...
ensuite, pour l'optimisation, je ne pense pas que tu gagneras bcp sur le plan vitesse d'execution (ca reste du vb).
mais il y a bcp d'optimisation de ta source au niveau code : en effet pour les fonction et procedure similaire tu utilise le meme code(ex :writeline aurait pu etre ecrite a partir de writedata, tu gagne un peu de lisibilité).
ensuite parfois des efforts d'indentation pourraient être fait mais bon...
Encore une chose, la classe textstream est, il me semble, deja presente dans la reference "scripting"...

Pour moi, ta source met donc inutile, elle n'apporte rien, ou que des choses pas vraiment utiles...la seule nouveauté ici reste le "SetPosition"... voilà pour ma part; mais boncomme disait celiphane, c ta source et t'as raison de la defendre, j'espere qu'elle t'est utile.

pour ce qui est des 2 APIs FillMemory et MemCopy, peut etre que tu gagnera du temps d'execution, mais sache que cela genere des appels, donc remplissage du stack et temps d'appel = 1cycle machine ou plus donc a prendre en consideration !!! bonne continuation
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008

Après mûres réflexions, j'ai conlu qu'il y a de nombreuses façons d'optimiser le code :
utiliser l'API fillmemory à la place de string
utiliser l'API MemCopy à la place de =
Juste c'est petite modification vont sûrement booster la classe. Il y a sans doute d'autres solutions pour optimiser d'avantage. Reste juste à les trouver.
Messages postés
466
Date d'inscription
samedi 16 février 2002
Statut
Membre
Dernière intervention
20 avril 2007

"bon j'ai fait des tests de vitesse et j'en ai conclu que ma classe est lente car il y a du vb pour la lecture des lignes"

> c'est déjà bien de l'admettre. Perso je pense pas que la simplicité puisse vraiment primée sur un open for as. Je vois pas la complication dans cette syntaxe. Toutefois tu défends ton bout de viande et c'est louable. Donc je n'irais pas plus loin mais je garde mes convictions... De toute facon tant que ta classe te servira, qu'est-ce que j'aurai à y dire ? hein ? c'est chacun sa soupe après tout ;)...

@+
Celiphane
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.