Windows - Fájlzárolások szkriptekkel

forráskód letöltése
Hálózatos programoknál több gépről több program írhatja, olvashatja ugyanazt a fájlt. Ha egyedi információról van szó, például több példányban futó számlázó programok az éppen aktuális számla sorszámot tárolják a szerveren egy fájlban, zárolást kell alkalmazni. Egyszerre csak egy programpéldány végezhet módosításokat, ezalatt a többiek nem olvashatják, illetve olvasás közben nem zárolhatják az állományt. Az alábbiakban készítünk három VBScriptet, melyek kombinált alkalmazása eleget tesz ezen feltételeknek.
Mellékeltük az alábbi szkripteket a következő néven:
"Appending.vbs" - Hozzáfűzésre nyitja meg a "Proba.txt" fájlt.
"Writing.vbs" - Írásra nyitja meg a "Proba.txt" fájlt.
"Reading.vbs" - Olvasásra nyitja meg a "Proba.txt" fájlt.
A "Proba.txt" fájlt szkriptből fogjuk generálni, ezért nincs vele külön teendő.
Ha szkriptekből végzünk fájlműveleteket a Windows Scripting Host (WSH) FilesystemObject (FSO) osztályára lesz szükségünk: olvasásokat, írásokat, átnevezéseket, másolásokat és egyéb fájlszintű feladatokat hajthatunk végre vele.
Fájl megnyitása írásra
Az alábbi szkript megnyitja a "C:\proba.txt" fájlt írásra, oly módon, hogy a fájlhosszt nullára állítja, ami egyenlő a teljes tartalmának törlésével. Egy üzenetablakban megjeleníti a megnyitás idejét és módját, amíg ezt nem zárjuk be, más alkalmazás nem lesz képes módosítani csak olvasni. A fenti számlázó programos példánál maradva ilyenkor írható be az új sorszám a fájlba. Másik gépekről ezt olvasni tudják, de módosítani nem, így nem állhat elő, hogy két egyforma sorszám keletkezik.
Az FSO a különböző megnyitási metódusokat számokkal jelöli. Áttekinthetőbb kódot kapunk, ha nem számokkal, hanem egyértelmű szövegekkel dolgozunk, ezért definiáljunk három konstanst, melyek értéke egyenlő a megnyitás típusával.
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Tároljuk el egy változóba a mintafájlunk nevét.
Filename = "c:\proba.txt"
Csatlakozzunk az FSO-hoz.
set fso = createobject("scripting.filesystemobject")
Ha a művelet során bármilyen probléma lépne fel, lépjünk ki a szkriptből. Ellenkező esetben végezzük el a megnyitást az "OpenTextFile" metódussal. Első paraméterként a kezelendő fájl nevét kell átadni, ezt követi a megnyitás módja (lásd a fenti konstansokat), végül egy logikai érték, ha "True", akkor a megadott fájl automatikusan létrejön, feltéve, hogy eddig nem létezett. 0,5 másodpercenként ellenőrizzük, hogy nem keletkezett-e hiba és csak akkor adjuk tovább a vezérlést, ha minden rendben van.
On Error Resume Next
Do: Err.Clear
  set tsFile = fso.OpenTextFile(Filename,ForWriting,True)
  If Err Then WScript.Sleep 50
Loop While Err
On Error GoTo 0
Jelenítsünk meg egy üzenetablakot, írjuk ki a megnyitás idejét. A mintafájl addig marad nyitva, amíg ez az ablak él a rendszerben. Bezárása után zárjuk be a mintafájlt is.
MsgBox Time() & " Megnyitva írásra",vbSystemModal
tsFile.Close
Fájl megnyitása hozzáfűzésre
Az előző módhoz képest annyi a különbség, hogy ezúttal hozzáfűzésre nyitjuk meg a mintafájlt. Ugyanúgy zárolódik mint az előbb, más alkalmazás nem képes írni, de mi igen (jelen szkriptből), viszont a tartalma nem törlődik.
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Filename = "c:\proba.txt"
set fso = createobject("scripting.filesystemobject")
On Error Resume Next
Do: Err.Clear
  set tsFile = fso.OpenTextFile(Filename,ForAppending,True)
  If Err Then WScript.Sleep 50
Loop While Err
On Error GoTo 0
MsgBox Time() & " Megnyitva hozzáfűzésre",vbSystemModal
tsFile.Close
Tegyünk egy próbát: nyissuk meg a fájlt hozzáfűzésre és próbáljuk megnyitni írásra. Mi történik? Az első szkript lefut, de a második csak akkor indul, ha az elsőből kiléptünk. A dolog tehát működik, csak egy szkript volt képes írásra megnyitni a mintafájlt a második 0,5 másodpercenként ellenőrzi a saját megnyitási kísérletének hibamentességét és addig nem fut le a hátralévő forráskód, amíg bármilyen probléma áll fenn.
Fájl megnyitása olvasásra
Az utolsó szkriptben olvasásra nyitjuk meg a fájlt:
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Filename = "c:\proba.txt"
set fso = createobject("scripting.filesystemobject")
On Error Resume Next
Do: Err.Clear
  set tsFile = fso.OpenTextFile(Filename,ForReading,True)
  If Err Then WScript.Sleep 50
Loop While Err
On Error GoTo 0
MsgBox Time() & " Megnyitva olvasásra",vbSystemModal
tsFile.Close 
Végezzünk el ismét egy tesztet: futtassuk a hozzáfűzést végző szkriptet, majd az olvasást végzőt. Tud egyszerre működni mindkettő, mert csak a mintafájl tartalmának módosítása nem engedélyezett, olvasása igen.