Classe pour contrôler parfaitement vos fichiers texte à ouvrir

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

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.