You are on page 1of 20

14.

P O G L A V L J E

Obrada pogona, mapa i datoteka

Kad programirate u Windowsima, vrlo je va`no imati sposobnost dodavanja, premje-


{tanja, mijenjanja, stvaranja ili brisanja mapa (direktorija) i datoteka, te upravljati po-
gonima i dobivati informacije o njima.
Visual Basic vam omogu}uje obradu pogona, mapa i datoteka na dva razli~ita na~ina:
kroz uobi~ajene postupke kao {to su naredbe Open, Write # i tako dalje, te kroz novi
skup alata, model objekta File System Object (FSO).

Sadr`aj
• Uvod u model objekata datote~nog sustava
• Programiranje u modelu FSO objekata
• Obrada datoteka starim naredbama i funkcijama

Uvod u model objekata datote~nog sustava


Nova osobina Visual Basica je model objekta File System Object (FSO), koji pru`a
alat temeljen na objektima za rad s mapama i datotekama. To vam omogu}uje upotrebu
poznate sintakse objekt.postupak s bogatim skupom svojstava, postupaka i doga|aja za
obradu mapa i datoteka, kao dodatak kori{tenju uobi~ajenih izraza i naredbi Visual
Basica.

Vodi~ za programere 731


II. dio [to mo`ete napraviti s Visual Basicom

Model FSO objekata (model objekata datote~nog sustava) daje va{im aplikacijama
sposobnost stvaranja, mijenjanja, premje{tanja i brisanja mapa, ili otkrivanja postoji li
odre|ena mapa, te ako postoji, gdje. On vam tako|er omogu}uje dobivanje informacija
o mapama, kao {to su njihova imena, datum kad su stvorene ili posljednji put mije-
njane, i tako dalje.
Model FSO objekata ~ini tako|er puno lak{im obradu datoteka. Kad obra|ujete dato-
teke, va{ je prvi cilj spremiti podatke u lako pristupa~nom obliku djelotvornom kao
izvor i po zauze}u prostora. Trebate biti sposobni stvarati datoteke, ubacivati i mije-
njati podatke, i proizvoditi (~itati) podatke. Iako podatke mo`ete spremati u baze po-
dataka, kao baze tipa Jet ili SQL, to dodaje zna~ajnu koli~inu nadgradnje va{oj apli-
kaciji. Zbog puno razloga, ne}ete `eljeti takvu nadgradnju, ili zahtjevi pristupa va{im
podacima ne}e trebati sve dodatne osobine pridru`ene s potpuno opremljenom bazom
podataka. U tom slu~aju, spremanje va{ih podataka u binarnu ili tekstualnu datoteku je
naju~inkovitije rje{enje.
Model FSO objekata, koji je sadr`an u tipskoj biblioteci Scripting (Scrrun.dll), podr`a-
va stvaranje i upravljanje tekstualnom datotekom kroz objekt TextStream. Me|utim, za
sada ne podr`ava stvaranje ili upravljanje binarnim datotekama. Kako bi upravljali bi-
narnim datotekama, upotrijebite naredbu Open sa zastavicom Binary. Pune informacije
o upravljanju binarnim datotekama nalaze se u odlomku “Kori{tenje binarnog pristupa
datotekama”, kasnije u ovom poglavlju.

Objekti datote~nog sustava


Model FSO objekata ima ove objekte:
objekt opis
Drive Omogu}uje vam skupljanje informacija o pogonima dodijeljenim sustavu, kao {to su
koliko je prostora raspolo`ivo, koje je njihovo ime dijela i tako dalje. Uo~ite da
“pogon” nije nu`no tvrdi disk. To mo`e biti pogon CD-ROM-a, RAM disk i tako
dalje. Tako|er, pogoni ne moraju biti fizi~ki povezani sa sustavom; mogu tako|er biti
logi~ki povezani kroz lokalnu mre`u (LAN).
Folder Omogu}uje vam stvaranje, brisanje ili premje{tanje mapa, te ispitivanje sustava o
njihovim imenima, stazama i tako dalje.
File Omogu}uje vam stvaranje, brisanje ili premje{tanje datoteka, te ispitivanje
sustava o njihovim imenima, stazama i tako dalje.
FileSystemObject Glavni objekt grupe, pun postupaka koji vam omogu}uju stvaranje, brisanje,
dobivanje popratnih informacija, te op}enito upravljanje pogonima, mapama i
datotekama. Ve}ina postupaka povezanih s ovim objektom jednaka je postupcima u
ostalim objektima.
TextStream Omogu}uje vam ~itanje i zapisivanje tekstualnih datoteka.

Za informacije o raznim svojstvima, postupcima i doga|ajima u modelu objekata


datote~nog sustava, upotrijebite pretra`iva~ objekata u Visual Basicu (pritisnite F2) i
pogledajte tipsku biblioteku Scripting.

732 Vodi~ za programere


14. poglavlje Obrada pogona, mapa i datoteka

Programiranje u modelu FSO objekata


Programiranje u modelu FSO objekata sadr`ava tri glavna zadatka:
• Kori{tenje postupka CreateObject ili dimenzioniranje varijable kao objekta tipa
FileSystemObject za stvaranje objekta tipa FileSystemObject.
• Kori{tenje odgovaraju}eg postupka na novostvorenom objektu.
• Pristup svojstvima objekta.
Model FSO objekata je sadr`an u tipskoj biblioteci nazvanoj Scripting, koja se nalazi u
datoteci Scrrun.dll. Ako ve} nemate pokaziva~ na nju, potvrdite stavku Microsoft Scri-
pting Runtime u dijalogu References dostupnom iz izbornika Properties. Nakon toga
mo`ete koristiti pretra`iva~ objekata kako bi vidjeli njezine objekte, zbirke, svojstva,
postupke i doga|aje, kao i njezine konstante.

Stvaranje objekta tipa FileSystemObject


Prvi korak je stvaranje objekta tipa FileSystemObject s kojim }ete raditi. Mo`ete to
napraviti na dva na~ina:
• Dimenzionirajte varijablu s tipom objekta FileSystemObject:
Dim fso As New FileSystemObject

• Upotrijebite postupak CreateObject za stvaranje objekta tipa FileSystemObject:


Set fso = CreateObject(“Scripting.FileSystemObject”)

U gornjoj sintaksi, Scripting je ime tipske biblioteke, a FileSystemObject je ime


objekta, od kojega stvarate primjer.
Napomena Prvi postupak radi samo u Visual Basicu, do drugi postupak radi i u
Visual Basicu i u VBScriptu.

Kori{tenje odgovaraju}eg postupka


Idu}i korak je kori{tenje odgovaraju}eg postupka objekta FileSystemObject. Na pri-
mjer, ako `elite stvoriti novi objekt, mo`ete upotrijebiti postupke CreateFolder ili
CreateTextFile (model FSO objekata ne podr`ava stvaranje ili brisanje pogona).
Ako `elite obrisati objekte, mo`ete upotrijebiti postupke DeleteFile i DeleteFolder
objekta FileSystemObject, ili postupak Delete objekata File i Folder.
Upotrebom odgovaraju}ih postupaka, mo`ete tako|er kopirati i premje{tati datoteke i
mape.
Uo~ite da su neke djelotvornosti u objektu tipa FileSystemObject suvi{ne. Na primjer,
mo`ete kopirati datoteku kori{tenjem postupka CopyFile objekta FileSystemObject, ili
mo`ete upotrijebiti postupak Copy objekta File. Oba postupka rade isto. Oba postoje
kako bi vam pru`ili maksimalnu fleksibilnost u programiranju.

Vodi~ za programere 733


II. dio [to mo`ete napraviti s Visual Basicom

Pristup postoje}im pogonima, datotekama i mapama


Kako bi dobili pristup postoje}em pogonu, datoteci ili mapi, upotrijebite odgovaraju}i
postupak “dobivanja” objekta FileSystemObject:
• GetDrive
• GetFolder
• GetFile
Na primjer:
Dim fso As New FileSystemObject, dato As File
Set dato = fso.GetFile(“c:\test.txt”)

Zapamtite, me|utim, da ne trebate upotrebljavati postupke “dobivanja” za novostvore-


ne objekte, jer su funkcije “stvaranja” ve} vratile hvataljku za novostvorene objekte.
Na primjer, ako stvorite novu mapu kori{tenjem postupka CreateFolder, ne trebate
zatim upotrijebiti postupak GetFolder za pristup njezinim svojstvima, kao {to su
Name, Path, Size, i tako dalje. Samo postavite varijablu na funkciju CreateFolder kako
bi dobili hvataljku za novostvorenu mapu, i zatim pristupite njezinim svojstvima, po-
stupcima i doga|ajima:
Private Sub Stvaranje_Mape()
Dim fso As New FileSystemObject, mapa As Folder
Set mapa = fso.CreateFolder(“c:\MojTest”)
MsgBox “Stvorena mapa: “ & mapa.Name
End Sub

Pristup svojstvima objekta


Kad ste jednom stvorili hvataljku za objekt, mo`ete pristupati njezinim svojstvima. Na
primjer, recimo da `elite dohvatiti ime odre|ene mape. Najprije }ete stvoriti primjer
objekta, zatim }ete dohvatiti hvataljku za njega odgovaraju}im postupkom (u ovom
slu~aju, postupkom GetFolder, jer mapa ve} postoji):
Set mapa = fso.GetFolder(“c:\”)

Sad kad imate hvataljku za objekt Folder, mo`ete provjeriti njegovo svojstvo Name:
Debug.Print “Ime mape je: “; mapa.Name

Ako `elite prona}i kad je datoteka posljednji put mijenjana, upotrijebite sljede}u
sintaksu:
Dim fso As New FileSystemObject, dato As File
‘ Dohvat objekta File za ispitivanje.
Set dato = fso.GetFile(“c:\detlog.txt”)
‘ Ispis informacije.
Debug.Print “Datoteka je mijenjana: “; fil.DateLastModified

734 Vodi~ za programere


14. poglavlje Obrada pogona, mapa i datoteka

Rad s pogonima i mapama


S modelom FSO objekata mo`ete raditi s pogonima i mapama programiraju}i, isto
kako to interaktivno mo`ete u Windows Exploreru. Mo`ete kopirati i premje{tati ma-
pe, dobivati informacije o pogonima i mapama, i tako dalje.

Dobivanje informacije o pogonima


Objekt Drive omogu}uje vam dobivanje informacije o raznim pogonima dodijeljenima
sustavu, fizi~ki ili putem mre`e. Njegova svojstva vam omogu}uju dobivanje informa-
cija o:
• ukupnoj veli~ini pogona u bajtovima (svojstvo TotalSize)
• koliko je prostora raspolo`ivo na pogonu u bajtovima (svojstva AvailableSpace ili
FreeSpace)
• koje je slovo dodijeljeno pogonu (svojstvo DriveLetter)
• koji je to tip pogona, je li izmjenjivi, tvrdi, mre`ni, CD-ROM ili RAM disk (svoj-
stvo DriveType)
• serijskom broju pogona (svojstvo SerialNumber)
• tip datote~nog sustava kojeg koristi pogon, kao FAT, FAT32, NTFS, i tako dalje
(svojstvo FileSystem)
• je li pogon na raspolaganju za upotrebu (svojstvo IsReady)
• imenu dijela i/ili volumena (svojstva ShareName i VolumeName)
•stazi ili korijenskoj mapi pogona (svojstva Path i RootFolder)

Primjer kori{tenja objekta Drive


Sljede}i primjer pokazuje kako upotrijebiti objekt Drive za sakupljanje informacija o
pogonu. Zapamtite da u sljede}em kodu ne}ete vidjeti pokaziva~ na stvarni objekt
Drive; umjesto toga, upotrijebit }ete postupak GetDrive za dobivanje pokaziva~a na
postoje}i objekt Drive ( u ovom slu~aju, pog):
Private Sub Command3_Click()
Dim fso As New FileSystemObject, pog As Drive, s As String
Set pog = fso.GetDrive(fso.GetDriveName(“c:”))
s = “Pogon “ & UCase(“c:”) & “ – “
s = s & drv.VolumeName & vbCrLf
s = s & “Ukupno prostora: “ & _
FormatNumber(pog.TotalSize / 1024, 0)
s = s & “ Kb” & vbCrLf
s = s & “Slobodnog prostora: “ &_
FormatNumber(pog.FreeSpace / 1024, 0)
s = s & “ Kb” & vbCrLf
MsgBox s
End Sub

Vodi~ za programere 735


II. dio [to mo`ete napraviti s Visual Basicom

Kori{tenje funkcije CurDir, te izraza ChDrive, ChDir i App.Path


Ako koristite funkciju CurDir, izraze ChDrive i ChDir, ili svojstvo Path (App.Path),
budite svjesni da oni mogu vratiti stazu UNC tipa (zna~i, \\Poslu`itelj\Dio...) prije
nego stazu pogona (kao E:\Mapa), ovisno o tome kako izvodite va{u aplikaciju ili pro-
jekt.
App.Path vra}a UNC stazu:
• Kad izvodite projekt nakon {to ste ga u~itali s dijela mre`e, ~ak i ako je dijelu
mre`e dodijeljeno slovo kao oznaka pogona.
• Kad izvodite prevedenu izvr{nu datoteku s dijela mre`e (ali samo ako se ona izvodi
koriste}i UNC stazu).
Izraz ChDrive ne mo`e rukovati UNC stazama, i zbog toga izaziva pogre{ku kad izraz
App.Path vrati takav tip. Mo`ete rukovati tom pogre{kom dodavanjem izraza On Error
Resume Next prije izraza ChDrive, ili ispitivanjem prva dva karaktera vrijednosti
izraza App.Path kako bi vidjeli jesu li oni backslash karakteri ( \ ):
On Error Resume Next
ChDrive App.Path
ChDir App.Path

Ovakva promjena obra|uje sve slu~ajeve u kojima se aplikacija pokre}e iz Windowsa


kori{tenjem UNC staze (na primjer, u dijalogu Run kojem se pristupa iz izbornika
Start), jer Windowsi postavljaju trenutan direktorij u UNC stazu. Izraz ChDir ispravno
rukuje mijenjanjem me|u UNC stazama (neuspjeh izraza ChDrive mo`e se zanemariti,
jer za UNC stazu ne postoji slov~ana oznaka pogona).
Me|utim, prethodni kod ne}e raditi ako ste pokrenuli aplikaciju upisivanjem UNC sta-
ze u naredbenu liniju MS-DOS-a. Razlog tomu je {to naredbena linija uvijek ima stazu
pogona za trenutan direktorij, pa je funkcija CurDir uvijek postavljena na stazu pogo-
na. Izraz ChDir ne izaziva pogre{ku, ali ne uspijeva promijeniti direktorij iz staze po-
gona u UNC stazu. Jedino rje{enje za takvu situaciju je pronala`enje lokalnog pogona
koji je pridru`en dijelu odre|enom u UNC stazi, ili upotreba mre`nih naredbi za
stvaranje takvog preslikavanja.
Ako je projekt u~itan u razvojnu okolinu Visual Basica iz dijela mre`e – ili UNC staze
ili preslikane staze pogona – izraz App.Path vra}a UNC stazu kad se projekt pokrene i
izraz ChDrive ne uspije ili izazove pogre{ku. Izraz ChDir ne izaziva pogre{ku, ali
direktorij se ne mijenja. Jedino rje{enje je ru~no odre|ivanje pogona i direktorija:
Const DIOPROJEKTA = “E:\MOJPROJEKT”
#Const Debug = True
#If Debug Then
ChDrive DIOPROJEKTA
ChDir DIOPROJEKTA
#Else
On Error Resume Next
ChDrive App.Path
ChDir App.Path
# End If

736 Vodi~ za programere


14. poglavlje Obrada pogona, mapa i datoteka

Ako vi{e od jedne osobe mo`e otvoriti projekt na dijelu mre`e, varijabla DOS okru`e-
nja se mo`e upotrijebiti za omogu}avanje svakoj osobi da ima svoj vlastiti preslikani
dio:
#Const Debug = True
#If Debug Then
ChDrive Environ(“DIRMOGPROJEKTA”)
ChDir Environ(“DIRMOGPROJEKTA”)
#Else
On Error Resume Next
ChDrive App.Path
ChDir App.Path
# End If

Vrijednost izraza DIRMOGPROJEKTA odre|uje slov~anu oznaku i stazu preslikanog


dijela, na primjer:
SET DIRMOGPROJEKTA=M:\VBProj\MojProjekt

Rad s mapama
Sljede}a popis pokazuje uobi~ajene poslove s mapama i postupke za njihovo ostvari-
vanje:
posao postupak
Stvaranje mape FileSystemObject.CreateFolder
Brisanje mape Folder.Delete ili FileSystemObject.DeleteFolder
Premje{tanje mape FolderMove ili FileSystemObject.MoveFolder
Kopiranje mape FolderCopy ili FileSystemObject.CopyFolder
Dohva}anje imena mape Folder.Name
Pronala`enje postoji li mapa na pogonu FileSystemObject.FolderExists
Dobivanje primjera postoje}eg objekta Folder FileSystemObject.GetFolder
Pronala`enje imena roditeljske mape FileSystemObject.GetParentFolderName
Pronala`enje staze sistemskih mapa FileSystemObject.GetSpecialFolder

Vodi~ za programere 737


II. dio [to mo`ete napraviti s Visual Basicom

Primjer
Ovaj primjer pokazuje upotrebu objekata Folder i FileSystemObject za upravljanje ma-
pama i dobivanje informacija o njima:
Private Sub Command0_Click()
‘ Dobivanje primjera objekta FileSystemObject.
Dim fso As New FileSystemObject, mapa As Folder, s As String
‘ Dobivanje objekta Drive.
Set mapa = fso.GetFolder(“c:”)
‘ Ispis imena roditeljske mape.
Debug.Print “Ime roditeljske mape je: “ & mapa
‘ Ispis imena pogona.
Debug.Print “Sadr`ana je na pogonu “ & mapa.Drive
‘ Ispis imena korijenske datoteke.
If mapa.IsRootFolder = True Then
Debug.Print “Ova mapa je korijenska mapa.”
Else
Debug.Print “ Ova mapa nije korijenska mapa.”
End If
‘ Stvaranje nove mape objektom FileSystemObject.
fso.CreateFolder (“c:\La`na”)
Debug.Print “Stvorena je mapa C:\La`na.”
‘ Ispis osnovnog imena mape.
Debug.Print “Osnovno ime = “ & fso.GetBaseName(“c:\La`na”)
‘ Brisanje novostvorene mape.
fso.DeleteFolder (“c:\La`na”)
Debug.Print “Obrisana je mapa C:\La`na.”
End Sub

Rad s datotekama
Mo`ete raditi s datotekama u Visual Basicu upotrebom novih objektno usmjerenih
FSO objekata, kao {to su Copy, Delete, Move i OpenAsTextStream, me|u ostalima, ili
upotrebom starijih postoje}ih funkcija kao {to su Open, Close, FileCopy, GetAttr i tako
dalje. Zapamtite da mo`ete premje{tati, kopirati i brisati datoteke neovisno o njihovom
tipu.
Za vi{e informacija o kori{tenju starijih postoje}ih funkcija, pogledajte odlomak
“Obrada datoteka starim naredbama i funkcijama” u ovom poglavlju. Ostatak ovog
dijela opisuje upotrebu novih FSO objekata, postupaka i svojstava za rad s datotekama.
Postoje dvije glavne kategorije upravljanja datotekama:
• Stvaranje, dodavanje ili brisanje podataka, i ~itanje datoteka
• Premje{tanje, kopiranje i brisanje datoteka

738 Vodi~ za programere


14. poglavlje Obrada pogona, mapa i datoteka

Stvaranje datoteka i dodavanje podataka sa


FSO objektima
Postoje tri na~ina stvaranja sekvencijalne datoteke teksta (ponekad nazvane kao “tijek
teksta”). Jedan na~in je kori{tenje postupka CreateTextFile. Praznu tekstualnu datoteku
mo`ete stvoriti ovako:
Dim fso As New FileSystemObject, dato As File
Set dato = fso.CreateTextFile(“c:\testdato.txt”, True)

Napomena Model FSO objekata jo{ ne podr`ava stvaranje binarnih datoteka i


datoteka s izravnim pristupom. Kako bi stvorili takve datoteke, upotrijebite naredbu
Open sa zastavicom Binary ili Random. Pune informacije o upravljanju binarnim
datotekama i datotekama s izravnim pristupom nalaze se u odlomcima “Kori{tenje
binarnog pristupa datotekama” i “Kori{tenje izravnog pristupa datotekama”, kasnije
u ovom poglavlju.
Drugi na~in je upotreba postupka OpenTextFile objekta FileSystemObject s postav-
ljenom zastavicom ForWriting:
Dim fso As New FileSystemObject, ts As New TextStream
Set ts = fso.OpenTextFile(“c:\testdato.txt”, ForWriting)

Tako|er mo`ete upotrijebiti postupak OpenAsTextStream s postavljenom zastavicom


ForWriting:
Dim fso As New FileSystemObject, dato As File, ts As TextStream
Set fso = CreateObject(“Scripting.FileSystemObject”)
fso.CreateTextFile(“test1.txt”)
Set dato = fso.GetFile(“test1.txt”)
Set ts = OpenAsTextStream(ForWriting)

Dodavanje podataka datoteci


Kad je stvorena tekstualna datoteka, mo`ete joj dodati podatke u tri koraka:
1. Otvorite tekstualnu datoteku za zapisivanje podataka.
2. Zapi{ite podatke.
3. Zatvorite datoteku.
Kako bi otvorili datoteku, mo`ete upotrijebiti jedan od dva postupka: postupak
OpenAsTextStream objekta File, ili postupak OpenTextFile objekta FileSystemObject.
Kako bi zapisali podatke u otvorenu tekstualnu datoteku, upotrijebite postupak Write
ili postupak WriteLine, oba od objekta TextStream. Jedina razlika izme|u ova dva po-
stupka je {to postupak WriteLine dodaje karakter oznake nove linije na kraj odre|enog
stringa.
Ako `elite dodati novu liniju tekstualnoj datoteci, upotrijebite postupak
WriteBlankLines.

Vodi~ za programere 739


II. dio [to mo`ete napraviti s Visual Basicom

Kako bi zatvorili otvorenu datoteku, upotrijebite postupak Close objekta TextStream.


Slijedi primjer otvaranja datoteke, upotrebe sva tri postupka zapisivanja podataka u
datoteku, i zatvaranja datoteke:
Sub Stvaranje_Datoteke()
Dim fso, txtdatoteka
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set txtdatoteka = fso.CreateTextFile(“c:\testdato.txt”, True)
txtdatoteka.Write(“Ovo je test. “) ‘ Zapisivanje linije.
‘ Zapisivanje linije s oznakom nove linije.
txtdatoteka.WriteLine(“Proba 1, 2, 3.”)
‘ Zapisivanje tri oznake nove linije u datoteku.
txtdatoteka.WriteBlankLines(3)
txtdatoteka.Close
End Sub

^itanje podataka sa FSO objektima


Kako bi pro~itali podatke iz tekstualne datoteke, upotrijebite postupke Read, ReadLine
ili ReadAll objekta TextStream:
posao postupak
^itanje odre|enog broja karaktera iz datoteke Read
^itanje cijele linije (sve do, ali ne uklju~uju}i, ReadLine
karaktera oznake nove linije)
^itanje cijelog sadr`aja tekstualne datoteke ReadAll
Ako koristite postupke Read ili ReadLine i `elite presko~iti do odre|enog dijela
podataka, mo`ete upotrijebiti postupke Skip ili SkipLine.
Rezultiraju}i tekst postupaka ~itanja spremljen je u stringu koji mo`e biti prikazan u
kontroli, dijeljen operatorima stringa (kao {to su Left, Right i Mid), ulan~an i tako
dalje.
Napomena Konstanta vbNewLine sadr`i karakter ili karaktere (ovisno o opera-
tivnom sustavu) koji pomi~u pokaziva~ na po~etak nove linije (oznaka kraja
reda/novi redak). Budite svjesni da krajevi nekih stringova mogu imati takve karak-
tere koji se ne ispisuju.

Primjer
Sub ^itanje_Datoteka()
Dim fso As New FileSystemObject, txtdatoteka, _
dat1 As File, ts As TextStream
Set txtdatoteka = fso.CreateTextFile(“c:\testdato.txt”, True)
MsgBox “Zapisivanje datoteke”
‘ Zapisivanje linije.
Set dat1 = fso.GetFile(“c:\testdato.txt”)

740 Vodi~ za programere


14. poglavlje Obrada pogona, mapa i datoteka

Set ts = dat1.OpenAsTextStream(ForWriting)
ts.Write “Pozdrav svijetu”
ts.Close
‘ ^itanje sadr`aja datoteke.
Set ts = dat1.OpenAsTextStream(ForReading)
s = ts.ReadLine
MsgBox s
ts.Close
End Sub

Premje{tanje, kopiranje i brisanje datoteka


Model FSO objekata ima po dva postupka za premje{tanje, kopiranje i brisanje
datoteka:
posao postupak
premje{tanje datoteke File.Move ili FileSystemObject.MoveFile
kopiranje datoteke File.Copy ili FileSystemObject.CopyFile
brisanje datoteke File.Delete ili FileSystemObject.DeleteFile

Primjer
Ovaj primjer stvara tekstualnu datoteku u korijenskom direktoriju pogona C, zapisuje
neke informacije u nju, premje{ta je u direktorij imena \tmp, stvara njezinu kopiju u
direktoriju imena \temp, te zatim bri{e kopije iz oba direktorija.
Kako bi izveli ovaj primjer, provjerite imate li direktorije s imenima \tmp i \temp u
korijenskom direktoriju pogona C:
Sub Upravljanje_datotekama()
Dim fso As New FileSystemObject, txtdatoteka, dat1, dat2
Set txtdatoteka = fso.CreateTextFile(“c:\testdato.txt”, True)
MsgBox “Zapisivanje datoteke”
‘ Zapisivanje linije.
txtdatoteka.Write(“Ovo je test.”)
‘ Zatvaranje datoteke za zapisivanje.
txtdatoteka.Close
MsgBox “Premje{tanje datoteke u c:\tmp”
‘ Dobivanje hvataljke za datoteku u korijenskom dir-u c:\.
Set dat1 = fso.GetFile(“c:\testdato.txt”)
‘ Premje{tanje datoteke u direktorij \tmp.
dat1.Move(“c:\tmp\testdato.txt”)
MsgBox “Kopiranje datoteke u c:\temp”
‘ Kopiranje datoteke u \temp.
dat1.Copy(“c:\temp\testdato.txt”)

Vodi~ za programere 741


II. dio [to mo`ete napraviti s Visual Basicom

MsgBox “Brisanje datoteke”


‘ Dobivanje hvataljki za trenutne polo`aje datoteka.
Set dat1 = fso.GetFile(“c:\tmp\testdato.txt”)
Set dat2 = fso.GetFile(“c:\temp\testdato.txt”)
‘ Brisanje datoteka.
dat1.Delete
dat2.Delete
MsgBox “Sve je obavljeno!”
End Sub

Obrada datoteka starim naredbama i


funkcijama
Jo{ od prve verzije Visual Basica, datoteke se obra|uju kori{tenjem naredbe Open i
ostalih povezanih naredbi i funkcija (ispisanih u nastavku). Ovi mehanizmi }e na kraju
biti izba~eni u korist modela FSO objekata, ali su potpuno podr`ani u Visual Basicu
6.0.
Ako mo`ete oblikovati svoju aplikaciju tako da koristi datoteke baze podataka, ne}ete
trebati pru`iti izravan pristup datotekama u svojoj aplikaciji. Kontrola podataka i kont-
role povezivanja omogu}uju vam ~itanje i zapisivanje podataka u i iz baze podataka,
{to je puno lak{e od kori{tenja tehnika izravnog pristupanja datotekama.
Me|utim, postoje trenuci kad trebate ~itati iz i zapisivati u datoteke koje nisu iz baze
podataka. Sljede}i skup tema pokazuje kako obra|ivati datoteke za izravno stvaranje,
upravljanje i spremanje teksta i drugih podataka.

Tipovi pristupa datotekama


Sama po sebi, datoteka se sastoji samo od niza povezanih bajtova spremljenih na
disku. Kad va{a aplikacija pristupi datoteci, mora pretpostaviti {to bi ti bajtovi trebali
predstavljati (karaktere, zapise podataka, cijele brojeve, stringove i tako dalje).
Ovisno o tome koju vrstu podataka sadr`i datoteka, upotrijebit }ete odgovaraju}i tip
pristupa datoteci. U Visual Basicu, postoje tri tipa pristupa datotekama:
• Sekvencijalni – Za ~itanje i zapisivanje tekstualnih datoteka u neprekidnim blokovi-
ma.
• Izravan – Za ~itanje i zapisivanje tekstualnih ili binarnih datoteka sastavljenih od
zapisa nepromjenjive duljine.
• Binaran – Za ~itanje i zapisivanje neodre|eno sastavljenih datoteka.
Sekvencijalni pristup (sequential access) je oblikovan za kori{tenje s jednostavnim
tekstualnim datotekama. Za svaki karakter u datoteci pretpostavlja se da predstavlja
karakter teksta ili karakter niza za oblikovanje teksta, kao {to je karakter nove linije
(NL). Podaci su spremljeni kao ANSI karakteri. Pretpostavlja se da je datoteka otvore-
na za izravan pristup (random access) sastavljena od niza zapisa jednake duljine.

742 Vodi~ za programere


14. poglavlje Obrada pogona, mapa i datoteka

Mo`ete primijeniti korisni~ki odre|ene tipove za stvaranje zapisa sa~injenih od puno


polja – svaki mo`e imati razli~ite tipove podataka. Podaci su spremljeni kao binarne
informacije.
Binarni pristup (binary access) vam dopu{ta kori{tenje datoteka za spremanje po-
dataka kako god `elite. Sli~an je izravnom pristupu, osim {to ovdje nema pretpostavki
o tipu podataka i duljini zapisa. Me|utim, morate to~no znati kako su podaci zapisani
u datoteku kako bi ih mogli ispravno dohvatiti.
Za vi{e informacija Kako bi nau~ili vi{e o tipovima pristupa podacima, pogledajte
odlomke “Kori{tenje sekvencijalnog pristupa datotekama”, “Kori{tenje izravnog pri-
stupa datotekama” i “Kori{tenje binarnog pristupa datotekama” , kasnije u ovom
poglavlju.

Funkcije i naredbe pristupanja datotekama


Sljede}e funkcije se koriste sa sva tri tipa pristupa datotekama:
Dir FileLen LOF
EOF FreeFile Seek
FileCopy GetAttr SetAttr
FileDateTime Loc

Sljede}a tablica ispisuje sve naredbe i funkcije pristupanja datotekama, dostupne za


svaki od tri tipa pristupa datotekama.
naredbe i funkcije sekvencijalni izravni binarni
Close X X X
Get X X
Input( ) X X
Input # X
Line Input # X
Open X X X
Print # X
Put X X
Type...End Type X
Write # X

Za vi{e informacija Za dodatne informacije o naredbama i funkcijama pristupa


datotekama, potra`ite tu funkciju ili naredbu u kazalu stalne pomo}i.

Vodi~ za programere 743


II. dio [to mo`ete napraviti s Visual Basicom

Kori{tenje sekvencijalnog pristupa datotekama


Preporu~eno je da upotrebljavate objekte FSO modela za stvaranje tekstualnih datote-
ka, ali sljede}e informacije su pru`ene u slu~aju da trebate upotrijebiti starije postupke
stvaranja tekstualnih datoteka.
Sekvencijalni pristup radi najbolje kad `elite obraditi datoteke koje se sastoje samo od
teksta, kao datoteke stvorene sa tipi~nim editorom teksta – zna~i, datotekama u kojima
podaci nisu podijeljeni u nizove zapisa. Sekvekcijalni pristup mo`da ne}e biti najpo-
godniji za spremanje dugih nizova brojeva, jer se svaki broj sprema kao tekstualni
karakter. ^etveroznamenkasti broj trebat }e 4 bajta za spremanje umjesto 2 bajta koja
su potrebna za spremanje istog broja kao cjelobrojne vrijednosti.

Otvaranje datoteka za sekvencijalni pristup


Kad otvorite datoteku za sekvencijalni pristup, otvarate ju za izvo|enje jedne od
sljede}ih operacija:
• Ulaz karaktera iz datoteke (Input)
• Izlaz karaktera u datoteku (Output)
• Dodavanje karaktera datoteci (Append)
Kako bi otvorili datoteku za sekvencijalni pristup, upotrijebite sljede}u sintaksu za
naredbu Open:
Open stazaime For [Input | Output | Append] As brojdatoteke [Len = veli~inaspremnika]
Kad otvorite sekvencijalnu datoteku za ulaz, datoteka ve} mora postojati; ina~e }e se
pojaviti gre{ka. Me|utim, kad poku{ate otvoriti nepostoje}u datoteku za izlaz ili doda-
vanje, naredba Open }e prvo stvoriti datoteku i zatim ju otvoriti.
Neobavezni argument Len odre|uje broj karaktera u me|uspremniku kod kopiranja
podataka izme|u datoteke i va{e aplikacije.
Nakon otvaranja datoteke za operacije Input, Output ili Append, morate ju zatvoriti,
koriste}i naredbu Close, prije nego {to ju ponovno otvorite za drugi tip operacije.

Editiranje datoteka otvorenih za sekvencijalni pristup


Ako `elite editirati datoteku, najprije pro~itajte njezin sadr`aj u varijable aplikacije,
zatim promijenite varijable, i na kraju, zapi{ite varijable natrag u datoteku. Sljede}i
odlomci raspravljaju o na~inu editiranja zapisa otvorenih za sekvencijalni pristup.

^itanje stringova iz datoteka


Kako bi dohvatili sadr`aj tekstualne datoteke, otvorite datoteku za sekvencijalni ulaz.
Zatim upotrijebite naredbe Line Input #, Input( ), ili Input # za kopiranje datoteke u
varijable aplikacije.
Visual Basic pru`a naredbe i funkcije koje }e pro~itati i zapisati jedan po jedan karak-
ter ili jednu po jednu liniju iz sekvencijalnih datoteka.
744 Vodi~ za programere
14. poglavlje Obrada pogona, mapa i datoteka

Na primjer, sljede}i dio koda ~ita datoteku jednu po jednu liniju:


Dim LinijeIzDato, Idu}aLinija As String

Do Until EOF(BrojDato)
Line Input #BrojDato, Idu}aLinija
LinijeIzDato = LinijeIzDato + Idu}aLinija + Chr(13) + Chr(10)
Loop

Iako izraz Line Input # prepoznaje kraj linije kad do|e do oznake kraj-reda/novi-redak,
ne uklju~uje tu oznaku kad pro~ita liniju u varijablu. Ako `elite zadr`ati oznaku kraj-
reda/novi-redak, va{ kod ju mora dodati.
Mo`ete tako|er upotrijebiti naredbu Input #, koja ~ita popis izraza brojeva i/ili izraza
stringova zapisanih u datoteku. Na primjer, kako bi pro~itali liniju iz datoteke sa po-
{tanskom popisom, mogli bi upotrijebiti sljede}i izraz:
Input #BrojDato, ime, ulica, grad, dr`ava, po{broj

Funkciju Input mo`ete upotrijebiti za kopiranje bilo kojeg broja karaktera iz datoteke u
varijablu, pru`aju}i varijablu koja je dovoljno velika. Na primjer, sljede}i kod upotre-
bljava funkciju Input za kopiranje odre|enog broja karaktera u varijablu:
LinijeIzDato = Input(n, BrojDato)

Kako bi kopirali cijelu datoteku u varijablu, upotrijebite funkciju InputB za kopiranje


bajtova iz datoteke u varijablu. Budu}i da funkcija InputB vra}a ANSI string, morate
upotrijebiti funkciju StrConv za pretvaranje ANSI stringa u UNICODE string, kako
slijedi:
LinijeIzDato = StrConv(InputB(LOF(BrojDato), BrojDato), vbUnicode)

Zapisivanje stringova u datoteke


Kako bi spremili sadr`aje varijabli u sekvencijalnu datoteku, otvorite ju za sekvenci-
jalne operacije Output ili Append, i zatim upotrijebite naredbu Print #. Na primjer, edi-
tor teksta mogao bi koristiti sljede}u liniju koda za kopiranje sadr`aja okvira s tekstom
u datoteku:
Print #BrojDato, Okvir.Text

Visual Basic tako|er podr`ava naredbu Write #, koja zapisuje popis izraza brojeva i/ili
izraza stringova u datoteku. Ova naredba automatski razdvaja svaki izraz zarezom i
postavlja znakove navodnika oko tekstualnih izraza:
Dim NekiString As String, NekiBroj As Integer

NekiString = “NekiKarakteri”
NekiBroj = 23445
Write #BrojDato, NekiString, NekiBroj

Vodi~ za programere 745


II. dio [to mo`ete napraviti s Visual Basicom

Ovaj dio koda zapisuje dva izraza u datoteku odre|enu podatkom BrojDato. Prvi izraz
sadr`i string, a drugi izraz sadr`i broj 23445. Stoga, Visual Basic zapisuje sljede}e
karaktere (uklju~uju}i sve znakove interpunkcije) u datoteku:
“NekiKarakteri”,23445

Napomena Ako upotrebljavate naredbe Write # i Input # sa sekvencijalnim


pristupom, razmislite o upotrebi izravnog ili binarnog pristupa umjesto toga, jer su
oni bolje opremljeni za rad sa zapisima podataka.
Za vi{e informacija Za dodatne informacije o sekvencijalnom pristupu datoteka-
ma, pogledajte odlomak “Naredba Open” u priru~niku Microsoft Visual Basic 6.0
Language Reference biblioteke Microsoft Visual Basic 6.0 Reference Library.

Kori{tenje izravnog pristupa datotekama


Model FSO objekata ne pru`a postupke stvaranja datoteke za izravan pristup ni po-
stupke izravnog pristupanja. Ako trebate stvoriti ili ~itati datoteke s izravnim pristu-
pom, ove informacije }e vam u tome pomo}i.
Bajtovi u datotekama za izravan pristup oblikuju jednake zapise, svaki od njih sadr`i
jedno ili vi{e polja. Zapis s jednim poljem prikladan je za svaki standardni tip podatka,
kao {to je cijeli broj ili string nepromjenjive duljine. Zapis savi{e od jednog polja prik-
ladan je za korisni~ki odre|en tip podatka. Na primjer, tip Djelatnik odre|en u na-
stavku stvara 19-bajtne zapise koji se sastoje od tri polja:
Type Djelatnik
Prezime As String * 10
Titula As String * 7
Rang As String * 2
End Type

Odre|ivanje varijabli
Prije nego {to va{a aplikacija otvori datoteku za izravan pristup, treba odrediti sve vari-
jable potrebne za rukovanje podacima iz datoteke. To uklju~uje korisni~ki odre|ene
tipove, koji odgovaraju zapisima u datoteci, kao i standardne tipove za ostale varijable
koje sadr`e podatke koji se odnose na obra|ivanje datoteke otvorene za izravan pristup.

Odre|ivanje tipova zapisa


Prije otvaranja datoteke za izravan pristup, odredite tip koji odgovara zapisima koje
stvara datoteka ili }e ih sadr`avati. Na primjer, datoteka Podaci Djelatnika mogla bi
odrediti korisni~ki odre|en tip podatka nazvanog Osoba na ovaj na~in:
Type Osoba
ID As Integer
Mjese~naPla}a As Currency
DatumZadnjegPregleda As Long
Ime As String * 15
Prezime As String * 15

746 Vodi~ za programere


14. poglavlje Obrada pogona, mapa i datoteka

Titula As String * 15
Napomene As String * 150
End Type

Odre|ivanje varijabli polja u odre|ivanju tipa


Budu}i da svi zapisi u datoteci za izravan pristup moraju imati istu duljinu, ~esto je
korisno da tekstualni elementi u korisni~ki odre|enom tipu imaju nepromjenjivu
duljinu, kao {to je prikazano u odre|ivanju tipa Osoba gore, gdje, na primjer, elementi
Ime i Prezime imaju nepromjenjivu duljinu od 15 karaktera.

Ako stvarni string sadr`i manje karaktera od nepromjenjive duljine tekstualnog ele-
menta u kojeg se zapisuje, Visual Basic preostala mjesta u zapisu popunjava karakteri-
ma razmaka (kod karaktera 32). Tako|er, ako je string dulji od veli~ine polja, vi{ak se
odrezuje. Ako upotrebljavate stringove duljine varijable, ukupna veli~ina svakog zapi-
sa spremljenog naredbom Put ili dohva}enog naredbom Get ne smije biti ve}a od
duljine zapisa odre|ene u dodatku Len naredbe Open.

Odre|ivanje ostalih varijabli


Nakon odre|ivanja tipa koji odgovara tipi~nom zapisu, odredite sve ostale varijable
koje va{a aplikacija treba za obra|ivanje datoteke otvorene za izravan pristup. Na
primjer:
‘ Varijabla zapisa.
Public Djelatnik As Osoba
‘ Pra}enje trenutnog zapisa.
Public Polo`aj As Long
‘ Broj zadnjeg zapisa u datoteci.
Public PosljednjiZapis As Long

Otvaranje datoteka za izravan pristup


Kako bi otvorili datoteku za izravan pristup, upotrijebite sljede}u sintaksu za naredbu
Open:
Open stazaime [For Random] As brojdatoteke Len = duljinazapisa
Budu}i da je tip Random podrazumijevani tip pristupa, klju~ne rije~i For Random su
neobavezne.
Izraz Len = duljinazapisa odre|uje veli~inu svakog zapisa u bajtovima. Zapamtite da
svaka varijabla stringa u Visual Basicu sprema string tipa Unicode i da trebate odrediti
duljinu u bajtovima za taj string tipa Unicode. Ako je vrijednost duljinazapisa manja
od stvarne duljine zapisa zapisanog u datoteci, stvorit }e se pogre{ka. Ako je vrijednost
duljinazapisa ve}a od stvarne duljine zapisa, zapis }e biti zapisan, iako }e dio prostora
na disku biti uzaludno potro{en.

Vodi~ za programere 747


II. dio [to mo`ete napraviti s Visual Basicom

Mo`ete upotrijebiti sljede}i kod za otvaranje datoteke:


Dim BrojDato As Integer, DuljinaZapisa As Long, Djelatnik As Osoba

‘ Izra~unavanje duljine svakog zapisa.


DuljinaZapisa = LenB(Djelatnik)
‘ Dobivanje idu}eg raspolo`ivog broja datoteke.
BrojDatoteke = FreeFile
‘ Otvaranje nove datoteke naredbom Open.
Open “MOJADATO.DAT” For Random As BrojDato Len = DuljinaZapisa

Editiranje datoteka otvorenih za izravan pristup


Ako `elite editirati datoteku za izravan pristup, najprije pro~itajte zapise iz datoteke u
varijable aplikacije, zatim promijenite vrijednosti u varijablama, i na kraju, zapi{ite
varijable natrag u datoteku. Sljede}i odlomci raspravljaju kako editirati datoteke
otvorene za izravan pristup.

^itanje zapisa u varijable


Upotrijebite naredbu Get za kopiranje zapisa u varijable. Na primjer, kako bi kopirali
zapis iz datoteke Podaci Djelatnika u varijablu Djelatnik, mo`ete upotrijebiti sljede}i
kod:
Get BrojDato, Polo`aj, Djelatnik

U ovoj liniji koda, varijabla BrojDato sadr`i broj koji naredba Open koristi za otvara-
nje datoteke; varijabla Polo`aj sadr`i broj zapisa kojeg treba kopirati; a varijabla
Djelatnik, odre|ena kao korisni~ki odre|en tip Osoba, prihva}a sadr`aj zapisa.

Zapisivanje varijabli u zapise


Upotrijebite naredbu Put za dodavanje ili zamjenu zapisa u datotekama otvorenim za
izravan pristup.

Zamjena zapisa
Kako bi zamijenili zapise, upotrijebite naredbu Put, odre|uju}i polo`aj zapisa kojeg
`elite zamijeniti; na primjer:
Put #BrojDato, Polo`aj, Djelatnik

Ovaj kod }e zamijeniti zapis broja odre|enog varijablom Polo`aj, s podacima u vari-
jabli Djelatnik.

Dodavanje zapisa
Kako bi dodali nove zapise na kraj datoteke otvorene za izravan pristup, upotrijebite
naredbu Put na na~in prikazan u prethodnom dijelu koda. Postavite vrijednost varijable
Polo`aj tako da bude za jedan ve}a od broja zapisa u datoteci. Na primjer, kako bi
dodali zapis datoteci koja sadr`i pet zapisa, postavite varijablu Polo`aj na 6.

748 Vodi~ za programere


14. poglavlje Obrada pogona, mapa i datoteka

Sljede}i izraz dodaje zapis na kraj datoteke:


PosljednjiZapis = PosljednjiZapis + 1
Put #BrojDato, PosljednjiZapis, Djelatnik

Brisanje zapisa
Mogli bi obrisati zapis ~i{}enjem njegovih polja, ali bi zapis i dalje postojao u datoteci.
Obi~no ne `elite prazne zapise u va{oj datoteci, jer tro{e prostor i dolaze u sukob sa
sekvencijalnim operacijama. Bolje je kopirati preostale zapise u novu datoteku, te
zatim obrisati staru datoteku.
Kako maknuti obrisani zapis iz datoteke za izravan pristup
1. Stvorite novu datoteku.
2. Kopirajte sve valjane zapise iz izvorne datoteke u novu datoteku.
3. Zatvorite izvornu datoteku i upotrijebite naredbu Kill kako bi ju obrisali.
4. Upotrijebite naredbu Name za primjenu imena nove datoteke u ime izvorne
datoteke.
Za vi{e informacija Za dodatne informacije o datotekama s izravnim pristupom,
pogledajte odlomak “Naredba Open” u priru~niku Microsoft Visual Basic 6.0
Language Reference.

Kori{tenje binarnog pristupa datotekama


Model FSO objekata ne pru`a postupke stvaranja datoteke za binarni pristup ni postup-
ke binarnog pristupanja. Ako trebate stvoriti ili ~itati datoteke s binarnim pristupom,
ove informacije }e vam u tome pomo}i.
Binarni pristup daje vam potpuni nadzor nad datotekom, jer bajtovi u datoteci mogu
predstavljati bilo {to. Na primjer, mo`ete u{tedjeti prostor na disku gradnjom zapisa
duljine varijable. Upotrijebite binarni pristup kad je va`no sa~uvati malu veli~inu
datoteke.
Napomena Kad zapisujete binarne podatke u datoteku, upotrijebite varijablu poda-
taka tipa Byte, umjesto varijable tipa String. Stringovi trebaju sadr`avati karaktere, a
binarni podaci mo`da ne}e biti odgovaraju}e spremljeni u varijablama tipa String.

Otvaranje datoteke za binarni pristup


Kako bi otvorili datoteku za binarni pristup, upotrijebite sljede}u sintaksu za naredbu
Open:
Open stazaime For Binary As brojdatoteke
Kao {to mo`ete vidjeti, sintaksa naredbe Open za binarni pristup razlikuje se sintakse
naredbe Open za izravan pristup po tome {to argument Len = duljinazapisa nije odre|en.
Ako uklju~ite duljinu zapisa u naredbu Open za binarni pristup, ona se zanemaruje.

Vodi~ za programere 749


II. dio [to mo`ete napraviti s Visual Basicom

Spremanje informacija u polja duljine varijable


Kako bi najbolje cijenili binarni pristup, razmotrite teoretsku datoteku Podaci Djelatni-
ka. Ova datoteka koristi zapise nepromjenjive duljine i polja za spremanje informacija
o djelatnicima.
Type Osoba
ID As Integer
Mjese~naPla}a As Currency
DatumZadnjegPregleda As Long
Ime As String * 15
Prezime As String * 15
Titula As String * 15
Napomene As String * 150
End Type

Neovisno o stvarnom sadr`aju polja, svaki zapis u toj datoteci zauzima 209 bajtova.
Kori{tenjem binarnog pristupa mo`ete smanjiti upotrebu prostora na disku. Po{to takav
pristup ne zahtjeva polja nepromjenjive duljine, u odre|ivanju tipa mogu se izostaviti
parametri duljine stringova.
Type Osoba
ID As Integer
Mjese~naPla}a As Currency
DatumZadnjegPregleda As Long
Ime As String
Prezime As String
Titula As String
Napomene As String
End Type

Public Djel As Osoba ‘ Odre|ivanje zapisa.

Zapis svakog djelatnika u datoteci Podaci Djelatnika sada sprema samo to~an broj
potrebnih bajtova jer su polja duljine varijable. Lo{a strana binarnog ulaza/izlaza s
poljima duljine varijable je {to ne mo`ete izravno pristupiti zapisima – morate pristu-
pati zapisima po redu kako bi saznali duljinu svakog zapisa. Mo`ete izravno tra`iti
polo`aj odre|enog bajta u datoteci, ali nema izravnog na~ina da znate koji je zapis na
kojem polo`aju bajta ako su zapisi raznih duljina.
Za vi{e informacija Za dodatne informacije o datotekama sa binarnim pristupom,
pogledajte odlomak “Naredba Open” u priru~niku Microsoft Visual Basic 6.0
Language Reference.

750 Vodi~ za programere

You might also like