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