0x42 – LSEEK – nastav aktuálnu pozíciu v súbore


<= =>


AH = 042
AL = počiatok presunu
0 = od začiatku súboru
1 = od aktuálnej pozície v súbore
2 = od konca súboru
BX = rukoväť súboru
CX:DX = offset od počiatku presunu k novej pozícii v súbore

Vracia :
DX:AX = nová pozícia v súbore v bajtoch od začiatku súboru
ak je nastavená vlajka CF
AX = kód chyby (0x01, 0x06)

Poznámky :
Pre počiatky 1 a 2, je možné ukazovateľ umiestniť aj pred začiatok súboru; nevráti sa žiadna chyba, ale nasledovné vstupno/výstupné operácie vyvolajú chybu. Ak je nová pozícia za aktuálnym koncom súboru, súbor bude zväčšený na veľkosť danú touto novou pozíciou pri nasledovnom zápise (AH = 0x40).
Volanie s AL = 2, CX = 0, DX = 0 vracia dĺžku súboru v DX:AX. Skutočná dĺžka je (DX * 65536) + AX.
Chyba : Použitie tejto metódy na zväčšenie súboru z 0 bajtov na veľmi značnú veľkosť, môže poškodiť FAT v niektorých verziách DOSu. Súbor by mal byť najskôr zväčšený z 0 na 1 bajt a potom na požadovanú značnú veľkosť.

Príklad :
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>

void main(void)
{
   union REGS regs;
   struct SREGS segregs;
   int i,subor=0;
   regs.h.ah = 0x3D;  // otvorenie súboru
   regs.h.al = 0;     // na čítanie
   char str[]="c:\\command.com";  // cesta k súboru
   unsigned long ulVelkost;

   regs.x.dx = FP_OFF(str);
   segregs.ds = FP_SEG(str);

   clrscr();

   intdosx(&regs, &regs, &segregs);

   if (regs.x.cflag==0)
   {
     subor = regs.x.ax; // uloženie rukoväte
     printf("\nSúbor %s bol otvorený a má kanál číslo %d \n", str, subor);
   }
   else
     printf("\nSúbor %s nebol otvorený, vznikla chyba č. : %d - %s", str, regs.x.ax, sys_errlist[regs.x.ax]);

  getch();

  if (subor!=0)
  {
    regs.h.ah = 0x42;  // nastavenie ukazovateľa v súbore
    regs.x.bx = subor; // rukoväť súboru
    // velkost posuvu CX,DX => (CX*65536) + DX
    regs.x.cx = 0;    // veľkosť posuvu - násobok 65536
    regs.x.dx = 0;    // veľkosť posuvu - max 65536
    regs.h.al = 2;  // posun v súbore
		    // 0 - od začiatku
		    // 1 - od aktuálnej pozície
		    // 2 - od konca

    intdos(&regs, &regs);

    if (regs.x.cflag==0)
    {
      // aktuálna pozícia je v DX,AX => DX*65536+AX
      ulVelkost = (regs.x.dx * 65536) + regs.x.ax;
      printf("\nSúbor %s má veľkosť %lu bytov \n", str, ulVelkost);
    }
    else
      printf("\nSkok v súbore %s sa nepodaril, vznikla chyba č. %d - %s ", str, regs.x.ax, sys_errlist[regs.x.ax]);


    regs.h.ah = 0x3E;   // zatvorenie súboru
    regs.x.bx = subor;  // rukoväť súboru

    intdos(&regs, &regs);

    if (regs.x.cflag==0)
      printf("\nSúbor \"%s\" bol zatvorený", str);
    else
      printf("\nSúbor nebol zatvorený, vznikla chyba č. : %d - %s", regs.x.ax, sys_errlist[regs.x.ax]);

    getch();
  }

}


<= =>