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
|