Trying to C a directory.
Steve Manes
manes at marob.masa.com
Sun May 28 03:18:42 AEST 1989
>From article <236100013 at mirror>, by root at mirror.TMC.COM:
> I am having trouble trying to figure out how to read a directory in
> MS-DOS. I would like to be able to read in the directory contents
> and then display them out onto the screen in a certain format.
Why I Like Turbo-C: it has the two functions you need, findfirst and
findnext, already in the libraries. There's also an example.
Alternatively, you will essentially need to recreate these functions
(something I had to do recently for a partner who refuses to do any DOS
programming except under VP/ix and Xenix) with DOS service calls. You
will also need to create two functions to get/save the current DTA and
to set a new DTA because the DTA is where DOS will dump each directory
record as it reads the disk.
Here's what I did (and it ain't purty). You may need to tweak this for
your compiler.
--------cut here-----cut here------cut here------cut here------
#include <stdio.h>
#include <dos.h>
#define D_RDONLY 0x01
#define D_HIDDEN 0x02
#define D_SYSTEM 0x04
#define D_LABEL 0x08
#define D_DIREC 0x10
#define D_ARCHIVE 0x20
struct DOSDIR {
char ff_reserved[21]; /* reserved for DOS */
char ff_attrib; /* DOS file attributes */
int ff_ftime; /* file time */
int ff_fdate; /* file date */
long ff_fsize; /* file size */
char ff_name[13]; /* file name */
};
struct DOSDIR fcb; /* FCB -- must maintain between calls! */
/* declarations */
void get_dta( int *, int * ), set_dta( int, int );
int dirfirst( char *name, struct DOSDIR *, int),
dirnext( struct DOSDIR * );
main()
{
int done;
printf("\nDirectory:\n");
done = dirfirst("*.*", &fcb, D_ARCHIVE);
while ( !done ) {
printf("%s\n", fcb.ff_name);
done = dirnext(&fcb);
}
}
int dirfirst( name, rec, attrib )
char *name;
struct DOSDIR *rec;
int attrib;
{
union REGS inregs, outregs;
struct SREGS segregs;
int dtaseg_old, dtaoff_old;
int rc;
get_dta(&dtaseg_old, &dtaoff_old); /* get current DTA */
set_dta( FP_SEG(rec), FP_OFF(rec) ); /* set new DTA */
inregs.h.ah = 0x4E; /* get first match */
inregs.x.cx = attrib;
segregs.ds = FP_SEG(name);
inregs.x.dx = FP_OFF(name);
rc = intdosx(&inregs, &outregs, &segregs);
set_dta( dtaseg_old, dtaoff_old); /* reset DTA */
return (outregs.x.cflag ? rc : 0 );
}
int dirnext( rec )
struct DOSDIR *rec;
{
union REGS inregs, outregs;
struct SREGS segregs;
int dtaseg_old, dtaoff_old;
int rc;
get_dta(&dtaseg_old, &dtaoff_old); /* get current DTA */
set_dta( FP_SEG(rec), FP_OFF(rec) ); /* set new DTA */
inregs.h.ah = 0x4F; /* get next match */
rc = intdosx(&inregs, &outregs, &segregs);
set_dta(dtaseg_old, dtaoff_old); /* reset DTA */
return (outregs.x.cflag ? rc : 0 );
}
void get_dta(segment, offset)
int *segment, *offset;
{
union REGS inregs, outregs;
struct SREGS segregs;
inregs.h.ah = 0x2F;
intdosx(&inregs, &outregs, &segregs);
*segment = segregs.es;
*offset = outregs.x.bx;
}
void set_dta(segment, offset)
int segment, offset;
{
union REGS inregs;
struct SREGS segregs;
inregs.h.ah = 0x1A;
segregs.ds = segment;
inregs.x.dx = offset;
intdosx(&inregs, &inregs, &segregs);
}
--
Steve Manes Roxy Recorders, Inc. Magpie-HQ BBS
UUCP : {rutgers|cmcl2}!hombre!magpie!manes (212)420-0527
Smail: manes at MASA.COM
More information about the Comp.lang.c
mailing list