| Ad_Infinitum |
| Administrator |

 |
 |
| Data inscrierii: 23/Iun/2007 |
| Mesaje: 212 |
|
|
|
 |
 |
 |
|
Pentru lucrul cu fisiere in VB6 exista citeva instructiuni:
Open "cale/fisier.ext" For Input As #1
Open "cale/fisier.ext" For Output As #2
Open "cale/fisier.ext" For Append As #3
Input #1, variabila
Line Input #1,variabila
Print #2,variabila
Close #1
Acesta nu-i un exemplu propriu-zis, ci doar o insiruire a instructiunilor pentru:
- deschiderea fisierelor - Open (pt. intrare - #1, pt. iesire - #2, pt. adaugare la sfirsit - #3)
- citirea din fisier, cu Input sau Line Input, in 2 variante, a 2-a varianta citind o linie intreaga (separata de CR / LF) intr-o variabila
- scrierea in fisier - Print
- inchiderea fisierului
La fel se lucreaza cu fisiere binare, avind insa grija sa declarati siruri bibare unde faceti citirea din fisier.
In plus, in loc de constantele #1, #2, #3 folosite aici se pot obtine identificatori pentru urmatorul nr. de fisier de fapt cu FreeFile:
n=FreeFile
Open "fisier" For Input As #n
Input #n, variabila
Close #n
Insa acest articol nu este pentru lucrurl natural cu fisiere in VB si nu intru aici in alte detalii despre lucrul in felul de mai sus cu fisierele. Problemele in VB apar cind este necesar prelucrarea unor fisiere foarte mari (zeci - sute de MB). Timpul de raspuns al VB-ului este teribil de incet căci incearca sa citeasta tot fisierul in memorie. De exemplu, pt. deschiderea fisierului nu va fi nici o problema insa cint ati pus
Line Input #1,variabila
a murit pur si simplu, la fisier de citeva sute de MB, plain-text, de exemplu.
Aici o sa aveti trebuință mai mult ca sigur functiile API Windows de lucru pe fisiere, care ofera un mare spor de viteza si sint accesibile inclusiv din VB.
Declaratiile de care o sa aveti necesitate (intr-o forma VB) sint:
| Citat: |
Private Const GENERIC_READ As Long = &H80000000
Private Const GENERIC_WRITE As Long = &H40000000
Private Const FILE_SHARE_READ As Long = &H1&
Private Const FILE_SHARE_WRITE As Long = &H2&
Private Const CREATE_NEW As Long = 1&
Private Const CREATE_ALWAYS As Long = 2&
Private Const OPEN_EXISTING As Long = 3&
Private Const OPEN_ALWAYS As Long = 4&
Private Const TRUNCATE_EXISTING As Long = 5&
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName$, ByVal dwDesiredAccess&, ByVal dwShareMode&, ByVal lpSecurityAttributes&, ByVal dwCreationDisposition&, ByVal dwFlagsAndAttributes&, ByVal hTemplateFile&) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile&, lpBuffer As Any, ByVal nNumberOfBytesToRead&, lpNumberOfBytesRead&, ByVal lpOverlapped&) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject&) As Long
|
Apoi puteti sa folosite ceva de genul:
| Citat: |
Dim aInputFile(5000) As Byte, hFile As Long, nReadRetVal As Long, nBytesRead As Long
Dim sTmp As String
hFile = CreateFile(App.Path & "/fisier.ext", GENERIC_READ, FILE_SHARE_READ, 0&, OPEN_EXISTING, 0&, 0&)
If hFile Then
Do
nReadRetVal = ReadFile(hFile, ByVal VarPtr(aInputFile(0)), 5000, nBytesRead, 0&)
If nReadRetVal > 0 Then
sTmp = StrConv(aInputFile, vbUnicode)
' Aveti deja in sTmp stringuri de pina la 5000 caractere, pt. prelucrat
' ... partea de prelucrarea textului ...
End If
Loop Until nBytesRead=0 ' se opreste la sfirsitul fisierului, nu mai returneaza nimic
End If
CloseHandle hFile
|
Dupa cum se vede, am utilizat un buffer de 5000 bytes, in care este citit testul si apoi convertit in string Unicode. Daca de exemplul fisierul de prelucrat are mărime variabila (poate e despartit de un caracter, pe linii sau pe coloane apoi) trebuie doar avut grija sa impartiti si voi bufferul pe linii si apoi pe coloane. Aici intervine treaba cu stringuri VB care poate nu mai pun probleme - impartiti întâia data pe linii cu Split(), poate asa:
x=Split(sTmp,vbCrLf)
Si apoi pe coloane:
For i=0 to UBound(x)-1
coloane=Split(x(i),vbTab)
Next
Am presupus ca liniile sint despartite de CR / LF si coloanele de TAB (pot si alte caractere sau combinatii). Apoi puteti folosi simplu coloane(0), coloane(1), ...
Mai trebuie doar sa aveti grija sa adaugati ultimul element din sirul X de mai sus, rezultat la debutantul Split() la linia urmatoare, pt. ca limita de 5000 de caractere folosita aici poate fi in mijlocul liniei.
Cu putina atentie si indeminare puteti obtine un spor de viteza semnificativ, întrebuințând acest mod de lucru. Spor la treaba. |
|