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