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...