File Definition Language
File Definition Language (FDL) je jazyk popisující organizaci souboru a formát záznamů v operačním systému OpenVMS. Na rozdíl od OS Unix a většiny novějších operačních systémů včetně MS-DOSu a MS Windows je součástí OpenVMS vrstva Record Management Services, která umožňuje pracovat na úrovni operačního systému s různými formáty a organizacemi souborů. FDL je nástroj, který umožňuje zvolit organizaci nově vytvářeného souboru nebo vytvořit kopii existujícího souboru s jinou organizací.
Organizace souborů
RMS podporuje čtyři přístupové metody k záznamům:
- Sekvenční přístup
- Přístup podle relativního čísla záznamu
- Record File Address přístup
- Indexovaný přístup
RMS podporuje čtyři formáty záznamů:
- záznamy s pevnou délkou
- záznamy s proměnnou délkou
- záznamy s proměnnou délkou a s pevnou délkou řídicích bloků
- soubory tvořené proudem bytů (v nichž jsou záznamy oddělené ukončovacími znaky)
- STREAM: záznamy zakončené znaky CRLF
- STREAM_CR: záznamy zakončené znakem CR
- STREAM_LF: záznamy zakončené znakem LF
Formáty textového souboru
Obyčejný textový soubor (členěný na řádky) může být na disku uložen různými způsoby:
- soubor je proud bytů každý řádek je zakončen k tomu určeným znakem nebo posloupností znaků:
- MS-Windows a MS-DOS používají dvojici znaků CR a LF
- Unixové systémy používají znak LF
- Počítače Apple Macintosh používají znak CR
- řádky jsou proměnné délky, na začátku každého řádku je informace o jeho délce – toto je standardní formát textových souborů v OpenVMS
- všechny řádky jsou doplněny mezerami nebo jinými znaky na pevnou délku, informace o délce řádků je uložena v metadatech souboru – tento formát byl obvyklý v době používání děrných štítků
OpenVMS umožňuje přímo prostředky operačního systému konvertovat soubory mezi uvedenými formáty.
Použití
Systém pro každý soubor udržuje informace o jeho organizaci a formátu záznamu. Tyto atributy se při kopírování souboru zachovávají. Problém může nastat:
- pokud se soubor zkopíruje z počítače, který používá jiný operační systém
- pokud jsou soubory sdíleny protokolem, který informace o atributech souboru nepodporuje (např. NFS)
- pokud jsou soubory zabaleny do archivu, který tyto atributy nepodporuje (například ZIP bez použití parametru "-V")
OpenVMS umožňuje:
- vytvořit soubor s určitými atributy
- vypsat atributy souboru
- opravit atributy souboru, pokud se liší od skutečného formátu souboru (bez změny vlastních dat)
- vytvořit kopii souboru, která bude mít stejný obsah, ale jiné atributy
Výpis atributů
Pro výpis atributů souboru lze použít buď příkaz DIR s parametrem /FULL nebo příkaz ANALYZE:
DIR /FULL ABC.TXT
Directory USER_DISK:[USER.SMITH] ABC.TXT;2 File ID: (407115,857,0) Size: 1/64 Owner: [MZ,SMITHJ] Created: 8-DEC-2015 13:23:34.38 Revised: 12-APR-2019 11:31:00.37 (61) Expires: <None specified> Backup: <No backup recorded> Effective: <None specified> Recording: <None specified> Accessed: <None specified> Attributes: <None specified> Modified: <None specified> Linkcount: 1 File organization: Sequential Shelved state: Online Caching attribute: Writethrough File attributes: Allocation: 64, Extend: 0, Global buffer count: 0, No version limit Record format: Stream_LF, maximum 0 bytes, longest 32767 bytes Record attributes: Carriage return carriage control RMS attributes: None Journaling enabled: None File protection: System:RWD, Owner:RWED, Group:R, World: Access Cntrl List: None Client attributes: None Total of 1 file, 1/64 blocks.
ANALYZE/RMS_FILE/FDL/OUTPUT=POPIS.FDL ABC.TXT
TYPE POPIS.FDL
IDENT FDL_VERSION 02 "10-MAY-2019 08:01:05 OpenVMS ANALYZE/RMS_FILE Utility" SYSTEM SOURCE OpenVMS FILE ALLOCATION 64 BEST_TRY_CONTIGUOUS no CLUSTER_SIZE 64 CONTIGUOUS no EXTENSION 0 FILE_MONITORING no NAME "USER_DISK:[USER.SMITHJ]ABC.TXT;2" ORGANIZATION sequential OWNER [MZ,SMITHJ] PROTECTION (system:RWD, owner:RWED, group:R, world:) GLOBAL_BUFFER_COUNT 0 GLBUFF_CNT_V83 0 GLBUFF_FLAGS_V83 none RECORD BLOCK_SPAN yes CARRIAGE_CONTROL carriage_return FORMAT stream_lf SIZE 0
Oprava atributů
Pokud organizace souboru na disku nesouhlasí s organizací uvedenou v metadatech souboru, je možné informace v metadatech upravit:
SET FILE /ATTRIB=(...)
popis ve .FDL souboru | Význam | SET FILE /ATTRIB=(…) |
---|---|---|
FORMAT stream | řádky zakončené CR+LF | RFM:STM |
FORMAT stream_cr | řádky zakončené CR | RFM:STMCR |
FORMAT stream_lf | řádky zakončené LF | RFM:STMLF |
FORMAT fixed | záznamy pevné délky | RFM:FIX |
FORMAT undefined | nedefinovaný formát | RFM:UDF |
FORMAT variable | záznamy proměnné délky | RFM:VAR |
FORMAT vfc | RFM:VFC | |
CARRIAGE_CONTROL none | RAT:NONE | |
SIZE | délka záznamu | LRL:32256 |
Například pro nastavení správného formátu záznamů u .BCK souboru lze použít:
SET FILE /ATTRIB=(RFM:FIX,RAT:NONE,LRL:32256) soubor.BCK
Textový soubor přenesený z Windows, který má špatné atributy, což se projevuje tak, že v editoru se zobrazuje na konci každého řádku nesmyslný znak, lze opravit příkazem:
SET FILE /ATTRIB=(RFM:STM) ABC.TXT
Textový soubor přenesený z Unixu, který má špatné atributy, což se projevuje tak, že se vypisuje schodovitě takto:
MACH1:BOB> TYPE MY_SCRIPT.COM $! $! MY_SCRIPT.COM $! $! Author: Bob Smith $! $! Date: 11-JUL-2013 $!
lze opravit příkazem:
SET FILE /ATTRIB=(RFM:STMLF) MY_SCRIPT.COM
Vytvoření souboru
Vytvořit soubor s určitými atributy:
CREATE /FDL=popis.FDL soubor
Zkonvertování souboru
Pro zkonvertování textového souboru organizovaného jako soubor s proměnnou délkou záznamů na textový soubor v unixovém formátu (konce řádku jsou LF) lze použít následující FDL soubor STREAM_LF.FDL:
RECORD FORMAT stream_lf
Vlastní konverze se provede příkazem:
CONVERT /FDL=STREAM_LF.FDL vstup.TXT vystup.TXT
Pro vytvoření textového souboru ve formátu MS-DOS nebo MS-Windows (konce řádku jsou CR+LF) by FDL soubor vypadal takto:
RECORD FORMAT stream
Zkonvertování souboru mimo OpenVMS
Pokud byl textový soubor s proměnnou délkou záznamů přenesen bez konverze z OpenVMS na jiný systém je možné k jeho konverzi použít následující skript vms2unix v jazyce Perl:
#!/usr/bin/perl
$filename=$ARGV[0];
open(FILE, $filename) || die "Error opening file $filename: $!\n";
do {
$read=read(FILE, $buf, 2);
($len)=unpack("v", $buf);
$read=read(FILE, $buf, $len);
$read=read(FILE, $skip, 1) if $len % 2;
$buf=~s/\x01\x8D//;
print $buf, "\n";
} while (!eof(FILE));
close(FILE);
Konverze se provede příkazem
$ vms2unix vstup.txt > vystup.txt
Historický příklad – konverze na soubor se pevnou délkou záznamu
Pro zkonvertování textového souboru záznamy s pevnou délkou 80 znaků (formát děrných štítků) lze použít soubor FIXED80.FDL obsahující:
RECORD FORMAT fixed SIZE 80
Vlastní konverze se provede příkazem:
CONVERT /FDL=FIXED80.FDL /FIXED_CONTROL /PAD=" " vstup.TXT vystup.TXT
Vytvoření FDL souboru
Soubor s popisem atributů lze získat několika způsoby:
- z existujícího souboru příkazem ANALYZE/RMS_FILE/FDL/OUTPUT=popis.FDL soubor
- příkazem EDIT /FDL popis.FDL
- vytvořit textový soubor popis.FDL
Organizaci souboru lze popsat *.FDL souborem. *.FDL pro existují soubor se vyrobí příkazem
ANALYZE/RMS_FILE/FDL/OUTPUT=organizace.FDL soubor
Pro výpis popisu organizace souboru na obrazovku lze použít /OUTPUT=SYS$OUTPUT
Kompletní popis textového souboru používajícího záznamy proměnné délky ve FDL:
IDENT FDL_VERSION 02 " 3-APR-2014 08:54:40 OpenVMS ANALYZE/RMS_FILE Utility" SYSTEM SOURCE OpenVMS FILE ALLOCATION 64 BEST_TRY_CONTIGUOUS no CLUSTER_SIZE 64 CONTIGUOUS no EXTENSION 0 FILE_MONITORING no NAME "USER_DISK:[USER.SMITHJ]VYPIS.TXT;1" ORGANIZATION sequential OWNER [SMITHJ] PROTECTION (system:RWED, owner:RWED, group:RE, world:) GLOBAL_BUFFER_COUNT 0 GLBUFF_CNT_V83 0 GLBUFF_FLAGS_V83 none RECORD BLOCK_SPAN yes CARRIAGE_CONTROL carriage_return FORMAT variable SIZE 0
Úvodní obrazovka příkazu EDIT /FDL soubor.FDL:
OpenVMS FDL Editor Add to insert one line into the FDL definition Delete to remove one line from the FDL definition Exit to leave the FDL Editor after creating the FDL file Help to obtain information about the FDL Editor Invoke to initiate a script of related questions Modify to change an existing line in the FDL definition Quit to abort the FDL Editor with no FDL file creation Set to specify FDL Editor characteristics View to display the current FDL Definition Main Editor Function (Keyword)[Help] :