Manipulace se soubory
Příkazy
DOS pro práci se soubory
Ve
FoxPro lze použít pro práci se soubory všech příkazů DOS. Příkaz musí
začínat vykřičníkem nebo slovem RUN. Zápis parametrů zůstává nezměněn.
V příkazech lze použít makrosubstituce.
!
DIR
aa="a:\kurs.prg\lekarna.dbf"
!
DEL &aa
Hvězdičková
a otazníková konvence DOS
V
konvenci DOS platí, že pro vyhledání skupiny souborů lze použít řetězce
sestaveného z otazníků, hvězdiček a písmen (jména souboru nebo souborů).
Otazník znamená jakékoliv znak, hvězdička libovolný počet (včetně nulového)
libovolných znaků. Pozor nezaměňovat s podobnou konvencí pro porovnávání
řetězců (funkce LIKE(), kde bylo možné zadat hvězdičku před skupinu znaků,
zde by znamenala "všechny soubory"). Řetězci se říká kostra nebo
šablona nebo maska a lze ho použít pro manipulaci se soubory.
Konvenci
se říká v literatuře Wild cards match (porovnání divokých karet) a kostře
skeleton.
!
DEL *.*
Nedostatek
paměti na disku nebo disketě
Množství
volné paměti na disku nebo na disketě se zjišťuje pomocí funkce
DISKSPACE()
Funkce
byla určena ke kontrole dostatečného prostoru pro pracovní soubory (například
před tříděním databázových souborů). Teď se používá zejména při
automatizovaném zálohování databázových a jiných souborů na disketách.
(Funkce je bez parametru.)
Příklad
procedury pro zápis databázového souboru na disketu (soubor je uzavřen):
PROCEDURE
DISKETA
&& Záhlaví procedury
PARAMETERS
DISK, SOUBOR
&& Formální parametry
AKTUALNI_ADRESAR
= FULL('')
&& Aktuální adresář
SET
DEFA TO &DISK
&&
Nastavení na disketu
PROSTOR=DISK()
&& Zjištění volného prostoru
SET
DEFA TO &AKTUALNI_ADRESAR
&& Návrat do aktuálního
adresáře
SELE
0
&& Volný pracovní
prostor
USE
&SOUBOR
&&
Otevření zapisovaného souboru
IF
PROSTOR >= HEADER()+RECCOUNT()*RECSIZE()
&&
Test: záhlaví + počet_záznamů*velikost_záznamu
USE
&&
Uzavření souboru
COPY
FILE &SOUBOR TO &DISK
&& Kopírování na
disketu
ELSE
&& Nedostatek místa
WAIT
"Soubor se nevejde
na disketu,...lib.klíč..." WIND
use
&&
Uzavření souboru
ENDIF
&& Konec testu a procedury
Kdyby
jsme potřebovali vědět, na kterém
disku jsou pracovní soubory použijeme funkce
..
SYS(2023)
Hledání
souborů podle hvězdičkové a otazníkové konvence
Často
je v praxi nutné opakovaně zpracovat soubory, které mají část jména společnou
a mají stejný obsah (stejnou strukturu). Například soubory s účetními
doklady od útvarů 1,2, 3,... mají jména UCET1.DBF, UCET2.DBF, UCET3.DBF,...
Když potřebujeme zjistit zda již přišel nějaký soubor, použijeme funkci
SYS(2000,<expC>[,1])
kde
ve významu <expC> zapíšeme "UCET*.DBF". Pro vyhledání prvního
ze souborů, vynecháme třetí parametr. Další soubor odpovídajícího jména
dostaneme stejnou funkcí, ale s parametrem 1. Když není již další soubor,
funkce vrátí prázdný řetězec.
?
SYS (2000,"UCET*.DBF")
UCET1.DBF
?
SYS (2000,"UCET*.DBF",1)
UCET2.DBF
?
SYS (2000,"UCET*.DBF",1)
UCET3.DBF
?
SYS (2000,"UCET*.DBF",1)
Zjištění
aktuálního adresáře
Zjištění
aktuálního adresáře se programuje funkcí:
CURDIR([<expC>])
parametr
<expC> zadává jméno disku. Když není zadán, pak funkce vrátí jméno
adresáře aktuálního disku (nastavení příkazem SET DEFAULT).
Zjištění
adresáře podle zadaného souboru
Zjištění
adresáře souboru se provádí funkcí:
FULLPATH(<soubor1>
[, <expN> | <soubor2>])
která
vrátí plné jméno souboru nebo jméno vztažené k umístění jiného
souboru. Jméno souboru se zadává parametrem <soubor1>. Je-li zadán
druhý parametr (na hodnotě nezáleží), hledá se soubor podle cesty zadané
v proměnné OS DOS a nikoliv podle cesty určené příkazem SET PATH.
Chceme-li získat jméno souboru <soubor1> vztažené k umístění jiného
souboru, jeho jméno zadáme parametrem <soubor2>.
nazev
= FULLPATH("FOXGRAPH.EXE",
"C:\FOXPRO2\GRAPH\FOXGRAPH.EXE")
zjištění
aktuálního adresáře
?
full("")
C:\FOXPRO2\PR
Částečně
interaktivní je funkce
LOCFILE(<expC1>
[, <expC2> [, <expC3>]])
která
vyhledá soubor na disku a vrací jeho plné jméno. Tato funkce se programuje v
případě, že dáváme možnost uživateli vybrat si z určité množiny
souborů.
<expC1>
- je jméno hledaného souboru
<expC2>
- zadává příponu souborů, které se objeví v nabídce a na které se omezí
hledání (když není v <expC1> zadána přípona).
-
Lze zadat jedinou příponu (například "PRG") nebo seznam přípon
oddělených středníky (například "PRG;DBF"). V nabídce se zobrazí
soubory mající zadané přípony.
-
Když se vyskytnou soubory, které mají stejné jméno a odlišné přípony,
pak v nabídce bude jen první z nich.
-
Když bude zadán seznam přípon oddělených svislou čárou (například
"PRG|DBF"), pak v nabídce se zobrazí všechny soubory (i se stejnými
jmény).
-
Když bude seznam obsahovat pouze středník ";", pak v nabídce budou
soubory, které nemají příponu.
-
Když nebude <expC2> zadáno, pak vystoupí všechny soubory aktuálního
adresáře.
-
Ve výrazu lze též použít kostry.
<expC3>
- je řetězec, který se vypíše v hlavičce nabídkového okna.
Postup
hledání - Soubor <expC1> zadaný pouze jménem (bez cesty) se hledá
nejprve v aktuálním adresáři, byla-li cesta zadána pak v zadaném adresáři.
Nenajde-li se zde, hledá se podle cesty nastavené příkazem SET PATH. Není-li
ani toto hledání úspěšné, otevře se nabídkové okno pro interaktivní
vyhledání souboru.
nazev
= LOCFILE("ucet*","DBF", "Který ze souborů použít?")
Vytvoření
statistického přehledu o souborech
Přehled
souborů vytvoří příkaz:
DISPLAY
FILES [ON <jednotka |
adresář>] [LIKE <kostra>]
[TO
PRINTER | TO file <soubor>]
Příkaz
vypíše seznam všech souborů nebo souborů zadaných kostrou (LIKE
<kostra>) z aktuální nebo zadané diskové jednotky nebo adresáře na
určené zařízení nebo do souboru <soubor>. Kromě jména souboru je
formou tabulky uveden počet záznamů (# Records), datum poslední aktualizace
(Last Update) a velikost souboru v byte (Size). Není-li zadaná fráze LIKE,
vypíše se statistika o databázových souborech.
DISPLAY
FILES
┌─────────────────────────────────────────────────────────
│ Database Files # Records Last Update Size
│ SLOVNIK.DBF 703 12.02.92 14829
│ FOXUSER.DBF 35 20.05.92 2848
│ KN.DBF 600 20.05.92 34362
│ SFP.DBF 103 23.02.92 6541
│ TEMATA.DBF 33 17.05.92 1253
│ XX.DBF 6 20.05.92 504
│
│ 60337 bytes in 6 files.
│ 16893952 bytes remaining on drive.
│
└─────────────────────────────────────────────────────────
Příkaz
se používá pouze pro zobrazení na obrazovku. Klauzule umístění se
specifikují v praxi raději u analogického příkazu:
LIST
FILES [ON <jednotka |
adresář>] [LIKE <kostra>]
[TO
PRINTER | TO file <soubor>]
který
nepřeruší výpis po zaplnění obrazovky nebo okna. Když jsou některé údaje
o souborech nutné pro řízení programu, pak je vhodnější programovat:
ADIR(<pole>
[, <expC1> [, <expC2>]])
která
statistiku o vybraných souborech umístí do pole.
<pole>
- nemusí předem existovat. Jeho velikost se automaticky upraví na dvojrozměrné
pole velikosti podle počtu souborů. V pěti sloupcích jsou postupně tyto údaje
o souboru: jméno, velikost, datum poslední aktualizace, čas, atributy
(AHRSD).
Význam atributů
│ A │ Archive
│ archivní, povoleno
čtení i zápis
│ H │ Hidden
│ uschovaný
│ R │ Read only
│ jen pro čtení
│ S │ System
│ systémový
│ D │ Directory
│ adresáře
<expC1>
- zadá adresář DOS a /nebo kostru pro výběr souborů. Neuvede ní parametru
znamená aktuální adresář.
<expC2>
- pomocí písmen H,S,D,V zadá speciální požadavky
pro výběr souborů skrytých (H) či systémových (S), na výpis informace o
podadresářích (D) nebo název disku (V - volume label). Funkce vrací počet
řádků pole. Tento údaj se používá jako mezní index tabulky.
=
ADIR (pr,"C:\pr\*.prg","D")
Uvedení
cesty při výpisu souborů
Při
výpisech souborů
SET
FULLPATH ON | OFF
Umožní
nebo potlačí uvedení cesty při výpisu jmen souborů.Uplatní se u funkcí
DBF() a NDX(). Implicitní nastavení je ON.
Nastavení
aktuálního adresáře
Nastavení
aktuální diskové jednotky nebo adresáře se programuje příkazem:
SET
DEFAULT TO [<expC>]
Diskovou
jednotku je možno zadat jen písmenem nebo písmenem následovaným dvojtečkou.
Pro zadání podadresářů je možno použít relativního odkazu podle známých
konvencí (dvě tečky - nadřazený adresář atd.).
SET
DEFAULT TO ..\lekarna
Pomocné
funkce:
SYS(5)
funkce
vrátí aktuální diskovou jednotku
SYS(2003)
vrátí
cestu do aktuálního adresáře bez aktuálního disku. Úplná cesta do aktuálního
adresáře se specifikuje: sys(5)+sys(2003)
Cesty
pro hledané soubory
Je
mnoho důvodů, proč významné nebo sdílené soubory neukládat do aktuálních
adresářů. Pro soubory, které nejsou v aktuálním adresáři se definují
cesty obdobně jako v DOS (při tom jde o jinou definici):
SET
PATH TO [<seznam
cest>]
Určuje
seznam adresářů, ve kterých bude FoxPro hledat soubory, které nenalezne v
aktuálním adresáři (oddělovačem je čárka nebo středník)
Alternativní
soubory
Alternativní
soubory jsou jednoduché textové soubory, do kterých se ukládá (současně)
výstup realizovaný na obrazovce pomocí otazníkových příkazů. (Současný
výstup na obrazovku lze potlačit příkazem SET CONSOLE OFF). Jde o často používané
příkazy tam, kde je nutno vytvářet textové soubory pomocného charakteru,
jako je například zadávání parametrů pro FOXGRAPH.
Založení
alternativního souboru se provede příkazem
SET
ALTERNATE TO [<soubor>
[ADDITIVE]]
Selekce
vystupujícího textu se řídí přepínačem
SET
ALTERNATE ON | OFF
(standardně OFF)
ADDITIVE
- přidá výstupy na konec existujícího souboru, jinak dojde k jeho přepsání
SET
ALTERNATE TO (bez parametru)
nebo
CLOSE
ALTERNATE
Uzavře
soubor otevřený příkazem SET ALTERNATE TO ...
Kopírování
souboru
Kopírování
obsahu jednoho souboru do druhého (bez ohledu na typ souboru se provádí příkazem
COPY
FILE <soubor1> TO
<soubor2>
Jestliže
cílový soubor neexistuje, vytvoří se, jinak se jeho obsah přepíše. Jména
obou souborů je třeba zadávat s příponou. Při kopírování databázových
souborů, které obsahují memo položky nezapomeňte na soubor FPT.
COPY
FILE 120.prg TO pr120.prg
Přejmenování
souboru
RENAME
<soubor1> TO
<soubor2>
Jména
obou souborů musí být zadána s příponou. <soubor2> nesmí existovat
a <soubor1> nesmí být otevřený (dojde k chybě).
RENAME
pr120.bak TO pr120.prg
Zrušení
souboru
DELETE
FILE [<soubor> | ?]
Jméno
souboru musí být zadáno s příponou, soubor nesmí být otevřený. Stejnou
funkci plní příkaz ERASE.
DELETE
FILE Temp.dbf
ERASE
<soubor> | ?
Ochrana
před přepsáním souboru
FoxPro
při pokusu o přepsání již existujícího souboru žádá od uživatele
potvrzení správnosti této akce. Potvrzení lze potlačit a standardní režim
lze obnovit příkazem:
SET
SAFETY ON | OFF
Uzavření
všech souborů
CLOSE
ALL
Příkaz
uzavře soubory všech typů, včetně souborů na nejnižší úrovni a nastaví
pracovní oblast 1. Současně zavře všechna okna pro LABEL, PROJECT, REPORT,
RQBE, SCREEN. Nemá vliv na systémová okna Command, Debug, Desk Accessories
(Filer,Special Character,...), Help, Trace.
Interaktivní
práce se soubory
FoxPro
obsahuje podpůrný prostředek pro interaktivní práci se soubory ve vývojové
fázi úlohy. V podstatě nahrazuje podpůrné prostředky jako je pctools,
dosshell apod. Okno pro interaktivní práci se soubory otevírá příkaz:
FILER
[LIKE <kostra>]
[NOWAIT]
[IN [WINDOW] <okno> | SCREEN]
Soubory
lze prohlížet, opravovat, kopírovat, rušit, přejmenovávat, vypisovat různé
statistiky atd.. Lze zadat kostru pro výběr souborů, které mají být
zobrazeny, frází LIKE <kostra>.
Založení
a modifikace textových souborů
MODIFY
COMMAND
nebo
MODIFY
FILE [<soubor> |
<kostra>]
[NOEDIT]
[NOWAIT][SAVE]
[RANGE
<expN1>, <expN2>]
[[WINDOW
<okno1>] [IN [WINDOW] <okno2> | SCREEN]]
Otevře
okno textového editoru pro úpravu nebo vytvoření textového souboru. Rozdíl
v příkazech je pouze v předpokládané příponě souboru.
MODIFY
COMMAND se používá na editování programů (implicitní přípona je PRG,
když je jiná, nutno jméno zadat s příponou. MODIFY FILE předpokládá jméno
souboru bez přípony.
Místo
jména souboru je možno zadat kostru. V tomto případě se otevře příslušný
počet oken (pro každý soubor jedno). Používá se pro současné pořizování
nebo aktualizaci více procedur jednoho programu. Původní soubory se ukládají
pod stejným jménem s příponou BAK.
NOEDIT
umožní
pouze prohlížení souboru.
RANGE
zobrazí
v editačním okně soubor od bytu <expN1> do bytu <expN2> (pro
zpracování nadměrných souborů)
SAVE
ponechá
pasivní obraz okna po ukončení příkazu na obrazovce (dříve se používal
pro kontextuální nápovědi).
Ochrana
dat
Ochrana
dat před nenadálou poruchou počítače (výpadek sítě) se programuje příkazem
FLUSH
který
uloží změny provedené ve všech otevřených databázových a indexových
souborech na disk.
Tohoto
příkazu se používá v případech programovaného řízení. Časové řízení
se programuje příkazem SET AUTOSAVE a používá se při vstupu dat z klávesnice.
Proto je probírán v příslušné kapitole.
Cvičení
Statistika
souborů
Program
pro zjištění aktuálních údajů o databázových souborech v aktuálním
adresáři. Údaje nutno uložit do pole np a pak vypsat ve formě tabulky na
obrazovku.
CLEAR
&& Výmaz obrazovky
SET
TALK OFF
&& Nezobrazovat mezivýsledky
FOR
i=1 TO ADIR (np,'*.dbf','A')
&& Všimnete si aplikace funkce ADIR
np[i,1]=np[i,1]+SPACE(12-LEN(np[i,1]))
&& Úprava prvku na konstantní délku
?
&&
Nový řádek
FOR
j=1 TO 5
??
np[i,j]
&& Zobrazení prvku
??
' '
&& Oddělovač
ENDFOR
&& Všechny sloupce
ENDFOR
&& Všechny řádky
Zobrazený
výsledek
SLOVNIK.DBF 14829 12.02.92 16:26:10 .A...
FOXUSER.DBF 2848 20.05.92 15:57:22 .A...
KN.DBF 34362 20.05.92 15:54:02 .A...
SFP.DBF 6541 23.02.92 9:41:20 .A...
TEMATA.DBF 1253 17.05.92 10:57:25 .A...
XX.DBF 219 20.05.92 15:54:23 .A...