II. rész

Folytatjuk előző számunkban elkezdett alapismeretek tárgyalását a DOS - FAT típusú - file-kezelése végett. Eddig megismerkettünk a lemez struktúra felépítésével úgy, mint a boot-szektorral, a FAT jelentôségével - és működésével, ezáltal a file-ok tárolási metódusával, a fő- ill. alkönyvtárak felépítésével, elhelyezkedésével (esetleges alkönyvtár töredezettséggel). Folytassuk ott ahol ugymond. "abbafejeztük": (magyarul ezt úgy mondják, hogy ahol abbahagytuk) szóval folytassuk a könyvtárak felépítésénél, az egyes könyvtár-bejegyzésekhez tartozó információk visszanyeréséhez.

Egy könyvtár-bejegyzés felépítése,

az elôzô számban elmondottak szerint így néz ki:

PDirectoryEntry = ^TDirectoryEntry;
TDirectoryEntry = record
  FileName : TChar8;
  Extension: TChar3;
  Attribute: Byte;
  Reserved : Array[1..10] of Byte;
  Time,
  Date,
  ClusterNumber: Word;
  FileSize     : Longint;
end;
 

 
7
6 
5
4
3 
2
1
0 
-
-
a 
d
v
s 
h
r
   
5 4 3 2 1 0 8 7 6 5 4 3 1 0
hour
minute
sec/2
   
5 4 3 2 1 9 8 7 6 5 4 2 1 0
év
nap
 

A file-kezelés DOS megszakítással

Mivel célunk egy olyan objektum létrehozása mely abszolút támogatja mind paraméterben és mind formátumban a file-kezelés DOS megvalosítását, ezért elôbb meg kell ismernünk a DOS file-kezelô rutinjait.

Miért akarjuk teljesen kompatibilissé tenni az objektumunk metódusainak paraméterezését az DOS azonos rutinjainak paraméterezésével ? Egyszerű: hogy használhasuk a lehetô legkisebb változtatással azon programjainkat melyen assembly beszúrással kezelik a file-okat. Végigvesszük a legalapvetôbb file-kezelési rutinokat.

A legalapvetôbb és egyben legrégibb file-kezelési módszer a DOS-ban (ill. a CP/M-ben akkor még anno 1980 felé) az FCB-s file-kezelés. De mi is ez az FCB ??? Tudjuk, hogy a CP/m-ben és a DOS 1.0-ban csak egy könyvtár a fôkönyvtár volt (ahogy a jó öreg C64-esek OP rendszerében) s abba volt minden belesuvvasztva, hisz 10 MB-ba nem sok minden férhetett. Tehát egy könyvtár van. Így az elsô file-kezelô utasítások amik az FCB-vel oldottak meg azok is egy könyvtárban tudnak műveletet végezni a file-okkal. Mi maga az FCB ?

Teljes neve: File Control Block. Ez nem más, mint egy rekord melyben az adatokat tároljuk, hogy EGY file-lal (DOS 1.0 még nincsenek wildchar * és ? karakterek !) műveletet végezhessünk. Ez a rekord tartalmazza:

E két alap dolgot mindenképen tartalmaznia kell, hogy a DOS megtalálhassa az adott névhez illô file-t. Pl. az alább közölt TFCB rekord alapján adjuk meg az információkat az OpenFileByFCB DOS rutinnak, s ha létezik a file megnyitja azt. A megnyitás abból áll, hogy kitölti az FCB rekord üresen maradt mezôit, ilyenek pl. a FileSize (file-hossz), FileDate - FileTime (az utolsó modosítás dátuma - ideje), DOS 5.0+ -nál már az Attributumot, a file kezdô cluster-ér a StartCluster-t és StartSector-t is visszaadja. (A most kevésbbé fontos mezôkkel nem foglalkozunk.)

Ha egy file-t megnyitottunk az Open (AH=0Fh) paranccsal, akkor azt le is kell zárni (Close) az AH=10h paranccsal, mert a DOS a nyitott FCB-s file-ok bizonyos adatait tárolja, s csak korlátozott, pl. 20 file-t lehet max. egyszerre FCB-vel megnyitni. (A CONFIG.SYS-ben lehet megadni a max. egyszerre FCB-vel megnyitható file-ok számat, FCBS = 20 paranccsal.) FCB-vel file írás | olvasás:

Az FCB-vel történô file-ba írás ill. onnan olvasás már más mezôk értelemszerű feltöltését is igényeli ezek:

Enny az alapvetô dolog amit az FCB-rôl tudni illik, de elôre bocsájtom, hogy csak ismeretterjesztés miatt közlöm a teljesség igénye nélkül, hisz manapság senki (persze kivéve a mazoistákat.) nem FCB-vel kezeli a file-okat.

(A DOS 2.0-ban a UNIX-ból átvett módon megjelent az alkönyvtár fogalma. Bármely könyvtárban lehet FCB-vel file-t kezelni akár a fôkönyvtárban. Annyi az FCB-s megkötés, hogy csak az aktuális könyvtárban keresi a file-t. Tehát C:\X\ könyvtárban nyitottuk meg a file-t és az épp aktuális könyvtár a C:\Y\ akkor illik - tudomásom szerint - visszaváltani a C:\X\-be. A DOS 5.0+ FCB-s kezelését mutatom be az alábbiakban, mert töbségünk DOS 5.0 feletti leginkább 6.22 ill. 7.0-t használ.) Lássuk az FCB-s és egyéb járulékos alapvetô DOS parancsot - rutint:

Most az FCB (már elavultnak számító) utasítások jönnek:  
  PFCB = ^TFCB;
  TFCB = record {for DOS 5.0+}
    DriveNumber   : Byte;
    FileName      : TChar8;
    FileExt       : TChar3;
    CurrBlockNum  : Word;
    LogicalRecSize: Word;
    FileSize      : Longint;
    FileDate,
    FileTime      : Word;
{S+}SysFileEntry  : Byte;
    Attribute     : Byte;
    ExtraInfo     : Byte;

    StartCluster  : Word;
    SectorNumber  : Word;
{E+}DirEntrypSec  : Byte;
    RecordInCurBlk: Byte;
    RndAccRecNum  : Longint;
    {R4sFCBsPos    : Byte;}
  end;

  PRFCB = ^TRFCB;
  TRFCB = record         {TRFCB: FCB for renaming}
    DriveNumber: Byte;   {az átnevezendô file meghajtója}
    OldFileName: TChar8; {régi név}
    OldFileExt : TChar3; {régi kiterjesztés}
    NillAreaLow: Array[1..5] of Char; {üres - fenntartott}
    NewFileName: TChar8; {új név}
    NewFileExt : TChar3; {új kiterjesztés}
    NillAreaHi : Array[1..9] of Char; {üres - fenntartott}
  end; Mi az a DTA ???

A DTA (Disk Transfer Address) a DOS egy speciális memória területe ahova a DOS számunkra ill. ahova mi a DOS számára a file-kezeléssel kapcsolatos adatokat - információs rekordokat helyez | helyezhetünk el. A DTA címe minden programnál elôször kiosztódik automatikusan: ezt a PSP $80-dik indexérôl olvashatjuk le (ez egy offszet-cím).

Pl.: A DTA-t használja adatcserére a DOS önmaga és az ôt használó program között az FCB-s file-kezelô utasítások | rutinok, ill. a file handle-vel működô utasítások.
Ha hosszabb DTA területet szeretnénk, hogy nagyobb darabokat olvashassunk FCB-Seq-Read-del, akkor azt a SetDTA-val állíthatjuk be.

  PDriveParameterBlock = ^TDriveParameterBlock;
  TDriveParameterBlock = record
    Drive             : Byte; {0: A, 1: B . . .}
    UNWDeviceDriver   : Byte;
    BytePerSector     : Word;
    SectorPerCluster  : Byte;
    SqrNSectorACluster: Byte;
    BootSizeInSector  : Word;
    FATNumber         : Byte;
    MaxDirectories    : Word;
    FirstDataSector   : Word;
    MaxCluster        : Word;
    SectorPerFAT      : Word;
    FirstDIRsSector   : Word;
    DeviceHeader      : PDeviceHeader;
    MediaID           : Byte;
    AccessByte        : Byte;
    NextDPB           : PDriveParameterBlock;
    FirstFreeCluster  : Word;
    FreeClusterssNumb : Word
  end;  {R4s_REM}

Nos végre, szerencsére végeztünk az alapvetô FCB-s vackokkal, következô számunkban már sokkal érdekesebb file-kezeléssel foglalkozunk, méghozzá a file-handle típusúval melyet minden program - és programozási-nyelv használ. (Esetleges kérdéseiteket várom eMail címemre ...) Mára ennyi, mert holnap vizsgázok ábrázoló-geometriából ...
 
 

 Bérczi László
eMail:PC-XUser@IDG.HU, Subject: "Tippek-Trukkok rovat"
BELA@MI.STUD.PMMFK.JPTE.HU