Za konec tega kratkega sprehoda skozi ščitenje resursov v okolju VBA (prvi del, drugi del in tretji del), si poglejmo še zaključni primer, torej ščitenje dostopa do datoteke.
Prikazal bom preprost razred, ki hrani številko (VBA do datotek prihaja preko številk, ki jih dodeli posamezni datoteki) in v kolikor je številka postavljena, kar pomeni, da je bila datoteka odprta, jo ob uničenju objekta zapre in uniči številko.
Z uporabo takšnega razreda oz. spremenljivke tega razreda lahko zanesemo na dejstvo, da bo vsaka datoteka, ki smo jo odprli tudi zaprta.
Razred za zaščito dostopa datotek
Option Explicit ' tu hranimo ID datoteke Private idDatoteke Private Sub Class_Initialize() ' na začetku ID-ja datoteke ne poznamo, ' saj datoteke še nismo odprli idDatoteke = -1 End Sub Private Sub Class_Terminate() ' v kolikor smo datoteko odprli ' jo tudi zapremo If (idDatoteke > 0) Then Close #idDatoteke End If End Sub ' s to funkcijo datoteko odpremo in tudi izvemo ali ' nam je odpiranje uspelo ali ne Public Function Odpri(imeDatoteke As String, _ vhod As Boolean) As Boolean ' predpostavimo, da nam odpiranje ne bo usplo Odpri = False ' pridobimo novo število idDatoteke = FreeFile ' v primeru napake odregiramo On Error GoTo napaka ' ali želimo datoteko pisati ali brati If (vhod) Then Open imeDatoteke For Input As idDatoteke Else Open imeDatoteke For Output As idDatoteke End If ' če smo prišli do sem, je odpiranje uspelo Odpri = True ' končamo Exit Function napaka: ' če smo tu, pomeni, da odpiranje ni uspelo idDatoteke = -1 End Function ' samo okrajšava gornje funkcije Public Function OdpriZaBranje(imeDatoteke As String) _ As Boolean OdpriZaBranje = Me.Odpri(imeDatoteke, True) End Function ' samo okrajšava gornje funkcije Public Function OdpriZaPisanje(imeDatoteke As String) _ As Boolean OdpriZaPisanje = Me.Odpri(imeDatoteke, False) End Function ' lastnost, ki nam vrne identifikacijsko ' številko datoteke, preko katere se bomo ' nanjo sklicevali Public Property Get id() id = idDatoteke End Property
Primer uporabe
Option Explicit Sub beriDatoteko(ime As String) ' ustvarimo spremenljivko Dim dat As New clsDatoteka ' v kolikor datoteke ne moremo odpreti končamo If (Not dat.OdpriZaBranje(ime)) Then Exit Sub ' spremenljivka, kamor bomo prebrali vsebino Dim vrstica ' vrtimo se dokler ne pridemo na konec datoteke Do While Not EOF(dat.id) Line Input #1, vrstica ' preveremo vsebino MsgBox vrstica ' in jo izpišemo Loop ' datoteka se bo zaprla sama End Sub Sub pisiDatoteko(ime As String) ' ustvarimo spremenljivko Dim dat As New clsDatoteka ' v kolikor datoteke ne moremo odpreti končamo If (Not dat.OdpriZaPisanje(ime)) Then Exit Sub ' pišemo Print #dat.id, "Prva vrstica v datoteki" Print #dat.id, "Druga vrstica v datoteki" Print #dat.id, "Tretja vrstica v datoteki" End Sub Sub Test() Dim ime As String ime = "d:\test.out" ' to ne bo uspelo beriDatoteko ime ' če ste ustrezno ureili ime bo to uspelo pisiDatoteko ime ' če je uspelo pisanje, bo tudi branje beriDatoteko ime End Sub