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(®s, ®s, &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(®s, ®s);
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(®s, ®s);
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();
}
}