Serißl - 7. dφl
Soubory, disky, adresß°e 1
13. Soubory, disky, adresß°e
13.1. Microsoft Scripting Runtime
Manipulace se soubory
╚tenφ a zßpis
Slo₧ky
Specißlnφ slo₧ky
Disky
Objekt File
13. Soubory, disky, adresß°e
Ve Visual Basicu (6.0) je mo₧no se soubory pracovat dv∞ma zp∙soby. Pomocφ standardnφch p°φkaz∙
a funkcφ Visual Basicu (Open, Write, Get, Put, Kill, ...) nebo pomocφ rozÜφ°enφ Microsoft Scripting Runtime (MSR).
MSR je nov∞jÜφ metoda (umφ pracovat i se slo₧kami, specißlnφmi slo₧kami a
diskov²mi jednotkami), ale neumφ zapisovat a Φφst binßrnφ soubory, pouze textovΘ. V tomto dφle
si popφÜeme prßci se soubory pomocφ tohoto rozÜφ°enφ. Dßle se takΘ nauΦφte pracovat se slo₧kami
a disky pomocφ dalÜφch objekt∙ rozÜφ°enφ MSR.
P°φÜt∞ budeme pokraΦovat pouze v prßci se soubory a slo₧kami pomocφ standardnφch p°φkaz∙ Visual Basicu.
13.1. Microsoft Scripting Runtime
Abyste mohli pracovat se souborem pomocφ tohoto rozÜφ°enφ, musφte na n∞j bu∩ p°idat odkaz
v menu Project | References (polo₧ka Microsoft Scripting Runtime) nebo vytvo°it objekt pomocφ
funkce CreateObject . V celΘ tΘto kapitole uvßdφme n∞kolik konstant (nap°.
p°i otevφrßnφ souboru apod.). Pokud je chcete vyu₧φvat, musφte mφt vytvo°en² v²Üe uveden²
odkaz. V ka₧dΘm p°φkladu v tΘto kapitole deklarujeme jak²koliv objekt MSR jako Object .
Samoz°ejm∞, ₧e m∙₧ete pou₧φt p°φmo deklarace nap°. As FileSystemObject ,
As File atd.
MSR obsahuje mnoho objekt∙ (FileSystemObject, File, Drive, Folder). Popisovat
vÜechny by bylo nad rßmec tohoto serißlu, proto si vysv∞tlφme pouze FileSystemObject
a File a trochu Drive . Prßce s dalÜφmi je ji₧ velmi podobnß, m∙₧ete si ji nastudovat pomocφ nßpov∞dy.
V dalÜφm textu budeme p°edpoklßdat, ₧e mßte vytvo°en² FileSystemObject nazvan² fs
- stejn∞ jako v tomto p°φkladu.
Dim fs As Object
Set fs=CreateObject("Scripting.FileSystemObject")
Manipulace se soubory
Stejn∞ jako jinΘ objekty, i FileSystemObject mß vlastnosti i metody. V tΘto kapitole si popφÜeme
ty, kterΘ n∞jak²m zp∙sobem manipulujφ se soubory, tj. kopφrujφ, ma₧ou, vytvß°ejφ.
fs.DeleteFile nazev [,force]
Sma₧e soubor nazev. Parametr force je typu Boolean . Pokud je nastaven
na False , soubory s atributem Read-Only se nesma₧ou, v opaΦnΘm p°φpad∞ ano. V nßzvu
souboru je mo₧no pou₧φvat i znaky * a ?.
fs.CopyFile zdroj, cil [,prepsat]
Kopφruje soubor zdroj do souboru cil. Parametr prepsat, jak jist∞ tuÜφte,
je typu Boolean a pokud je True , ji₧ existujφcφ cφlov² soubor
bude p°epsßn, v opaΦnΘm p°φpad∞ nastane chyba. Pokud mß existujφcφ cφlov² soubor nastaven atribut Read-Only,
soubor se nep°epφÜe, i kdy₧ je prepsat nastaveno na True .
fs.MoveFile zdroj, cil
P°esune soubor zdroj do souboru cil. Stejn∞ jako u dvou p°edchozφch metod
je mo₧no pou₧φt znaky * a ?.
Zp∞t na obsah
╚tenφ a zßpis
Abyste mohli Φφst nebo zapisovat, musφte soubor nejd°φve otev°φt pomocφ metody
OpenTextFile . Tato metoda vracφ objekt TextStream, kter² umo₧≥uje zapisovat
a Φφst soubor.
fs.OpeTextFile(nazev [,typ] [,vytvorit] [,format]
nazev specifikuje nßzev souboru
typ - zp∙sob otev°enφ
ForReading - pouze pro Φtenφ
ForAppending - p°idßvßnφ na konec souboru
vytvorit - pokud soubor neexistuje, nastavenφ na True zp∙sobφ jeho vytvo°enφ
format - urΦuje formßt otev°enΘho souboru
TristateUseDefault û otev°e podle nastavenφ systΘmu
TristateTrue û otev°e soubor jako UNICODE
TristateFalse - otev°e soubor jako ASCII
P°φklad:
Dim fs As Object, f As Object
Set fs=CreateObject("Scripting.FileSystemObject")
Set f=fs.OpenTextFile("soubor1.txt", ForAppending, True)
Tento p°φklad otev°e soubor soubor1.txt pro p°idßvßnφ na konec, pokud soubor neexistuje,
tak jej vytvo°φ a otev°e jej jako ASCII soubor (default).
Data ze soubor m∙₧ete Φφst pomocφ t°ech metod. Read (vracφ zadan² poΦet znak∙), ReadLine
(vracφ cel² °ßdek) a ReadAll (vracφ cel² soubor). Nßsledujφcφ dva p°φklady spoΦφtajφ
poΦet velk²ch pφsmen v souboru.
Dim fs As Object, f As Object, pocet As Long, znak As String * 1
Set fs=CreateObject("Scripting.FileSystemObject")
Set f=fs.OpenTextFile("soubor1.txt", ForReading, True)
pocet = 0
Do While Not f.AtEndOfStream
znak = f.Read(1)
If znak >= "A" AND znak <= "Z" Then pocet = pocet + 1
Loop
MsgBox "PoΦet velk²ch pφsmen: " & pocet
f.Close
Druh² p°φklad d∞lß to samΘ, pouze pomocφ metody ReadAll .
Dim fs As Object, f As Object, pocet As Long, i As Long, soubor As String
Set fs=CreateObject("Scripting.FileSystemObject")
Set f=fs.OpenTextFile("soubor1.txt", ForReading, True)
soubor = f.ReadAll
f.Close
pocet = 0
For i = 1 To Len(soubor)
If Mid(soubor, i, 1) >= "A" AND Mid(soubor, i, 1) <= "Z" Then pocet = pocet + 1
Next i
MsgBox "PoΦet velk²ch pφsmen: " & pocet
V obou p°φkladech jsme pou₧ili pro vßs do te∩ neznßmou metodu, Close . Tato uzavφrß
TextStream, tj. soubor. Soubory je d∙le₧itΘ uzavφrat, proto₧e jak vÜichni vφme, poΦet
otev°en²ch soubor∙ je omezen² a navφc, pokud do souboru zapisujete a neuzav°ete jej, zm∞ny
se neprovedou.
Zßpis do souboru je podobn² Φtenφ. Metoda Write do souboru jednoduÜe
zapφÜe zadan² °et∞zec, WriteLine zapφÜe °et∞zec a za n∞j p°idß znak konce °ßdky a
poslednφ metoda pro zßpis, WriteBlankLines do souboru zapφÜe zadan² poΦet
znak∙ ukonΦenφ °ßdky.
Dim fs As Object, f As Object
Set fs=CreateObject("Scripting.FileSystemObject")
Set f=fs.OpenTextFile("soubor1.txt", ForAppending, True)
f.Write("n∞jak² text")
f.WriteLine("pokraΦovßnφ °ßdky")
f.WriteBlankLines(1)
f.WriteLine("poslednφ °ßdek")
f.Close
P°φklad vytvo°φ takov²to soubor:
n∞jak² textpokraΦovßnφ °ßdky
poslednφ °ßdek
Chcete-li pouze vytvo°it soubor a nic do n∞j nezapisovat, m∙₧ete pou₧φt metodu
CreateTextFile . Metoda vytvo°φ textov² soubor nulovΘ dΘlky a vrßtφ
objekt TextStream .
Dim fs As Object, tx As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Set tx = fs.CreateTextFile("D:\pokus.txt")
tx.Close
Zp∞t na obsah
Slo₧ky
Pro manipulaci se slo₧kami existuje op∞t mnoho metod, ukß₧eme si ty nejd∙le₧it∞jÜφ.
fs.CopyFolder zdroj, cil [,prepsat]
Metoda kopφruje slo₧ku zdroj (vΦetn∞ vÜech "podslo₧ek") do slo₧ky cφl. Argument prepsat
je typu Boolean a pokud je nastaven na True , ji₧ existujφcφ slo₧ky
budou p°epsßny. Parametr zdroj m∙₧e obsahovat i znaky * a ?.
fs.CreateFolder(slozka)
Metoda vytvo°φ slo₧ku slozka.
fs.DeleteFolder slozka [,force]
Metoda sma₧e slozku slozka a vÜechny podslo₧ky. Parametr force je typu
Boolean a pokud je True , sma₧ou se i slo₧ky s atributem ReadOnly. Pokud
je False a slo₧ka mß atribut ReadOnly, nastane chyba.
fs.MoveFolder zdroj, cil
Metoda p°esune slo₧ku zdroj do slo₧ky cil. Parametr zdroj m∙₧e op∞t obsahovat
i znaky * a ?.
Pro nßzornost si uvedeme p°φklad. Na disku C vytvo°φ slo₧ku ZALOHA, zkopφruje do nφ obsah
slo₧ky WINDOWS\TEMP, dßle vytvo°φ slo₧ku ZALOHA2 a p°esune do nφ celou slo₧ku ZALOHA.
Nakonec sma₧e slo₧ku ZALOHA2.
Dim fs As Object
Set fs = CreateObject("Scripting.FileSystemObject")
fs.CreateFolder "C:\ZALOHA"
fs.CopyFolder "C:\WINDOWS\TEMP", "C:\ZALOHA", True
fs.CreateFolder "C:\ZALOHA2"
fs.MoveFolder "C:\ZALOHA", "C:\ZALOHA2\"
fs.DeleteFolder "C:\ZALOHA2", True
Zp∞t na obsah
Specißlnφ slo₧ky
Objekt FileSystemObject umφ zjistit, kde se nalΘzajφ n∞kterΘ slo₧ky systΘmu Windows. Prozatφm
umφ t°i zßkladnφ. Slo₧ku WINDOWS, systΘmovou slo₧ku WINDOWS a slo₧ku pro doΦasnΘ adresß°e, tedy
TEMP. N∞komu se m∙₧e zdßt tato snaha zbyteΦnß, ale ne ka₧d² u₧ivatel instaluje systΘm Windows
na disk C do slo₧ky WINDOWS. Stejn∞ tak je to i u slo₧ky TEMP.
Metoda, kterß tohle umφ, je GetSpecialFolders .
fs.GetSpecialFolders(specifikace)
Argument specifikace, urΦuje, kterou slo₧ku chcete nalΘzt. WindowsFolder
vracφ slo₧ku WINDOWS, SystemFolder vracφ systΘmovou slo₧ku Windows - v∞tÜinou
WINDOWS\SYSTEM - a poslednφ, TemporaryFolder vracφ slo₧ku pro doΦasnΘ soubory.
Zp∞t na obsah
Disky
Jedinou vlastnostφ, kterou mß FileSystemObject , je vlastnost Drives .
Tato vlastnost vracφ kolekci objekt∙ Drive , kterΘ umo₧≥ujφ pracovat s jednotkami.
Samotn² objekt Drive mß pouze vlastnosti, tak₧e nenφ mo₧nΘ s jednotkami
manipulovat, pouze nastavovat n∞kterΘ jejich vlastnosti.
Tento p°φklad projde vÜechny disky na VaÜem poΦφtaΦi a do okna Immediate zobrazφ pφsmeno
ka₧dΘ jednotky a jejφ nßzev (label).
Dim fs As Object, drv As Object
Set fs = CreateObject("Scripting.FileSystemObject")
For Each drv In fs.Drives
Debug.Print drv.DriveLetter & ": " & drv.VolumeName
Next drv
DalÜφ vlastnosti disk∙, kterΘ lze zjiÜ¥ovat, n∞kterΘ i m∞nit (abyste m∞li
alespo≥ zßkladnφ p°ehled, co lze s disky d∞lat), jsou nap°.
AvailableSpace (dostupnß velikost disku v bytech), DriveType (typ disku -
pevn², sφ¥ov², CD-ROM atd.), FreeSpace (volnΘ mφsto na disku v bytech),
SerialNumber (seriovΘ Φφslo disku) a mnoho dalÜφch.
Zp∞t na obsah
Objekt File
Nejd°φv vßm ukß₧eme, jak pomocφ kolekce Files "projφt" vÜechny soubory v n∞jakΘ
slo₧ce (v tomto p°φkladu je to slo₧ka WINDOWS).
Dim fs As Object, fld As Object, fl As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Set fld = fs.GetFolder("C:\WINDOWS")
For Each fl In fld.Files
Debug.Print fl.Name
Next fl
P°φklad vypφÜe do okna Immediate nßzvy vÜech soubor∙ ve slo₧ce C:\WINDOWS.
S objektem File toho jde d∞lat samoz°ejm∞ mnohem vφce, ne₧ jenom zjiÜ¥ovat jmΘno.
Metody objektu jsou pouze pro kopφrovßnφ, p°esouvßnφ a mazßnφ souboru. To jsme si vÜak
ukßzali pomocφ FileSystemObjektu, proto se zam∞°φme na vlastnosti. Abychom mohli se souborem
pracovat, musφme mφt na n∞j vytvo°en odkaz. Ten lze vytvo°it pomocφ metody GetFile
objektu FileSystemObject . Metoda vracφ objekt File .
Dim fs As Object, fl As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Set fl = fs.GetFile("C:\autoexec.bat")
Atributy souboru
Pomocφ vlastnosti Attributes lze nastavit nebo zjistit atributy souboru.
Dim fs As Object, fld As Object, fl As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Set fld = fs.GetFolder("C:\WINDOWS\TEMP")
For Each fl In fld.Files
If fl.Attributes AND 2 Then fl.Attributes = fl.Attributes - 2
Next fl
P°φklad prochßzφ slo₧ku WINDOWS\TEMP a pokud nalezne soubor s atributem Hidden (tedy skryt²
soubor), odstranφ tento atribut. P°i prßci s atributy je nutno vzφt v ·vahu, ₧e chcete-li
odstranit pouze n∞jak² urΦit² atribut, musφte zachovat p∙vodnφ atributy. Proto to odΦφtßnφ
v p°φkladu. A pokud chcete zjistit, zda mß soubor nastaven urΦit² atribut, nelze vlastnost
Attributes porovnßvat pouze s k≤dem tohoto atributu. Tato vlastnost toti₧ vracφ
Φφslo, kterΘ je souΦtem vÜech atribut∙ souboru. Bude-li nap°. soubor ReadOnly a navφc Hidden,
bude vlastnost vracet hodnotu 3 (1+2). Porovnßte-li hodnotu Attributes s Φφslem
2 (hidden), rovnost samoz°ejm∞ nenastane a proto chybn∞ urΦφte, ₧e soubor nenφ Hidden. Z tohoto
d∙vodu nelze porovnßvat pomocφ = , ale pomocφ AND .
Nßzev a cesta
Vlastnost Name vrßtφ nßzev souboru, ale bez cesty. Vlastnost ParentFolder
naopak vracφ pouze cestu k souboru. Kombinacφ obou je potom Path , kterß vracφ
nßzev i cestou.
Dim fs As Object, fld As Object, fl As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Set fld = fs.GetFolder("C:\WINDOWS\TEMP")
For Each fl In fld.Files
Debug.Print "Nßzev souboru: " & fl.Name
Debug.Print "Cesta k souboru: " & fl.ParentFolder
Debug.Print "Nßzev i s cestou: " & fl.Path
Next fl
Pokud pot°ebujete znßt krßtkΘ jmΘno souboru (8.3) nebo krßtkou cestu, m∙₧ete pou₧φt vlastnosti
ShortName a ShortPath . Prvnφ vracφ zkrßcenΘ jmΘno, druhß
zkßcenou cestu i se jmΘnem. Vlastnost, kterß by vracela pouze krßtkou cestu nenφ implementovßna.
Ale m∙₧ete si ji "vytßhnout" pomocφ metody GetParentFolderName objektu
FileSystemObject .
Dim fs As Object, fld As Object, fl As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Set fld = fs.GetFolder("C:\WINDOWS\TEMP")
For Each fl In fld.Files
Debug.Print "Krßtk² nßzev souboru: " & fl.ShortName
Debug.Print "Krßtkß cesta k souboru: " & fs.GetParentFolderName(fl.ShortPath)
Debug.Print "Krßtk² nßzev i s cestou: " & fl.ShortPath
Next fl
Typ souboru
Vlastnost Type vracφ °et∞zec, kter² popisuje typ souboru. Zvolφte-li nap°.
soubor s p°φponou .TXT, vrßcen² °et∞zec bude "Textov² dokument".
Objekt File mß dßle implementovßny vlastnosti DateCreated
(datum vytvo°enφ souboru), DateLastAccessed (datum poslednφho p°φstupu),
DateLastModified (datum poslednφ ·pravy), Drive (pφsmeno disku,
na kterΘm se soubor nachßzφ) a Size (velikost souboru v bytech).
Zp∞t na obsah
|