|
zxy17191
初级用户
积分 22
发帖 7
注册 2008-4-6
状态 离线
|
『楼 主』:
dos下怎么用c查询剩余空间
dos下怎么c查询剩余空间,我用的是pc104主板,也可以用cf卡,是否一样的查询啊
|
|
2008-4-6 17:25 |
|
|
zhgwbzhd
高级用户
积分 506
发帖 187
注册 2005-12-4
状态 离线
|
『第
2 楼』:
好像有一个中断可以查询,你查一下。
|
|
2008-4-6 17:50 |
|
|
zyl910
中级用户
积分 282
发帖 126
注册 2006-5-17
状态 离线
|
『第
3 楼』:
摘自 Terrv Dettmann《DOS Programmer's Reference,4th Edition》:
8.2.1驱动器信息
可利用DOS功能调用来获取磁盘驱动器方面的信息。drvinfo.c程序分析了怎样获得
和显示这个信息(见列表8.1)。注意该程序没有将4.0版的新的32位扇区的可能性考虑
进来;4.0版的《技术参考手册》也没有指出驱动器信息要注意这种变化。
列表8.1
/*dRvinfo.c
Listing 8.1 of DOS Programmer'S Reference*/
#include<Stdio.h>
#include<dOS.h>
#include<Ctype.h>
#include "drvinfo.h"
/*Prototypes*/
void get_drvinfo(char drv,struct drvinfo*info);
unsigned int get_drive(void);
void get_drvspace(char drv,struCt drvinfo*info);
void main()
{
int drive;
drive = get_drive();
printf("\n\n");
printf("Current Drive Code=%u(%c:)\n",drive,'A'+drive);
printf("\n");
get_drvinfo('A'+drive,&info);
173页
printf("Drive %c: infOrmation from funCtion 1Ch\n",'A'+drive);
printf("Number Of clusters=%lu\n",info.cluSters);
printf("SectOrS per Cluster=%lu\n",infO.spc);
printf("Physical sector Size=%lu\n",info.SecSize);
printf("DriVe Size=%lu Kb\n",
(info.clusters*info.spc*info.secsize)/1024);
printf("\n");
get_drvspace('A'+drive,&info);
printf("Drive %c: infOrmatiOn frOm function 36h\n",'A'+drive);
printf("Number of cluSterS=%lu\n",infO.ClUSterS);
printf("SectorS per cluSter=%lu\n",info.Spc);
printf("PhySical sector size=%lu\n",info.SecSize);
printf("Drive siZe=%lu Kb\n",
(info.clusters*info.spc*info.secsize)/1024);
printf("Available cluSters=%lu\n",infO.avail);
printf("Available Space=%lu Kb\n",
(info.avail*info.spc*info.secsize)/1024);
Printf("\n");
}
/*Fetch the current drive code*/
unsigned int get_drive()
{
union REGS regs;
regs.h.ah=0x19;
intdos(®s,®s);
return (regs.h.al);
}
/*Fetch drive information using function 1Ch*/
vOid get_drvinfo(drv,info)
char drv;
Struct drvinfO*infO;
{
union REGS regs;
Struct SREGS segs;
int dn;
/*Converts drive letter to internal representation*/
drv=toupper(drv);
dn=drv-'A'+1;
/*Set up and call DOS*/
regS.h.ah=0x1c;
regS.h.dl=dn;
intdosx(®s,®s,&segs);
infO->Spc=regS.h.al;
info->fatseg=segs.ds;
infO->fatoff=regS.X.bx;
infO->SeCSize=regS.x.cx;
infO->CluSterS=regS.x.dx;
}
/*Fetch drive information using function 36h*/
void get_drvspace(drv,info)
174页
char drv;
Struct drvinfo*info;
{
union REGS regs;
struct SREGS segs;
int dn;
/*Converts drive letter to internal representation*/
drv=toupper(drv);
dn=drv-'A'+1;
/*Set up and make the DOS call*/
regs.h.ah=0x36;
regs.h.dl=dn;
intdosx(&regs,&regs,&segs);
info->spc=regs.x.ax;
info->avail=regs.x.bx;
info->secsiZe=regs.x.cx;
info->clusters=regs.x.dx;
}
为了获取有关驱动器的信息,drvinfo.c调用了下列几个子例程:
get_drive(),获取当前驱动器号
get_drvinfo(),获得驱动器的一般信息
get_drvspace(),获得其它信息
所有这些信息都放在drvinfo结构中,正如drvinfo.h所定义的那样,见列表8.2。
列表8.2
/* drvinfo.h
Listing 8.2 of DOS Programmer's Reference*/
struct drvinfo{
unsigned long spc; /*Sectors per cluster*/
unsigned long avail; /*Available clusters*/
unsigned long fatseg;/*FAT segment of ID byte*/
unsigned long fatoff;/*FAT offset of ID byte*/
unsigned long secsize;/*Physical sector size*/
unsigned long clusters;/*Number of clusters*/
char fatid; /*FAT ID byte*/
}info;
通过定义一个结构来容纳有关磁盘的信息,就可以保证在需要这些信息时,这些信息
总是有逻辑地组织在一起的。
注意列表8.1中的drvinfo.c程序包括两个子例程调用;这些调用说明了同样的信息
可用多种途径来获取。
获取驱动器信息是一个简单的过程——可以调用DOS服务中断(int 21h)。在C语言
中该调用由intdos()函数来执行,在pascal中则由Msdos来完成。DOS服务将驱动器代码
返回到Al寄存器中。
175页
get_drive()函数不解释驱动器代码;它只是将代码返回给drvinfo.c。但是请求特定驱
动器信息的过程要比请求驱动器号的过程复杂一些。信息返回到段寄存器中,就象返回到
通用寄存器一样。要访问段寄存器,必须使用intdosx()函数,正如在get_drvinfo()和get_
drvspace()函数中所做的那样。
在这些函数调用了DOS(intdosx函数调用)之后,该函数就会将从寄存器中返回的信
息保存在函数调用所传递的info结构中。处理象这样结构中的信息,能使没有寄存器或
Dos调用方面知识的人,通过调用该函数的程序来访问它。稍稍再做一点工作,这些函数
就可以包含在那些不知道怎么处理DOS的程序员的函数库之中。
get_drvinfo()和get_drvspace()是编程实践中的很好例子——将执行细节隐藏在函
数之中。这种情况下,用户就通过所熟悉的驱动器字母(A、B、C等)标准格式来确定正确
的驱动器代码。
允许驱动器名作为一个字母来传递,这是一条途径,它可以隐藏如下事实,即在DOS
和BIOS例程中,驱动器标志并不总是稳定的。有些例程使用0来表示A驱动器,但有些则
用0来表示默认的驱动器。
get_drvspace()所返回的信息可能比get_drvinfo()返回的信息在程序中用得更多。例
如,用get_drvspace()可以利用DOS功能36h所返回的下述信息来确定磁盘上有多少自
由空间可用。
寄存器 内含物
AX 每个簇的扇区数
BX 有效扇区数
CX 每扇区的字节数
DX 每个驱动器的簇数
要计算驱动器上的自由空间,可利用下列公式:
BX*AX*CX
下列公式则计算驱动器容量的总数:
DX*AX*CX
如果只想确定磁盘上有多少自由空间,可以编写函数get_free())来仅仅返回这方面
的信息。列表8.3中的free.c程序调用了get_free()来获得这方面的信息,它为得到可用
的和整个的磁盘空间,而使用了驱动器名和指向整数的指针。
列表8.3
/*free.c
Listing 8.3 of DOS Programmer's Reference*/
#include<Stdio.h>
/*Prototypes*/
void get_free(char drv,unsigned long*avail,unsigned long*total);
void main(argc,argv)
int argc;
char*argv[];
176页
{
unsigned long avail,total;
get_free(*argv[1],&avail,&total);
if(*argv[1])
printf("Free diSk space on drive %c: iS %lu Kb Of %lu Kb\n",
*argv[1],avail,total);
else
printf("Free disk space on default drive is %lu Kb of %lu Kb\n",
avail, tOtal);
}
编写这个程序来为驱动器名而检查第一个命令行参数。如果没有提供第一个参数,程
序就假定它应该发现默认驱动器的信息。
get_free()函数确定它应检查哪一个驱动器,然后设置参数并进行对DOS的调用(见
列表8.4)。功能36h用于确定自由空间,但大部分磁盘信息已被舍弃,因为该函数的有限
目的并不需要它们。
列表8.4
/*get_free.c
Listing 8.4 of DOS PrOgrammer's Reference*/
#include<stdio.h>
#include<ctype.h>
#include<dos.h>
void get_free(drv,avail,total)
char drv;
unsigned long*avail,*tOtal;
{
union REGS regs;
struct SREGS segs;
int dn;
unsigned long SectCluster;
unsigned long AvailCluster;
unsigned long BytesSector;
unsigned long Clusters;
/*Determines the drive and sets the drive number*/
if(drv){
drv=toupper(drv);
dn=drv-'A'+1;
}else{
dn=0;
}
/*Sets up and makes the DOS function call*/
regs.h.ah=0x36;
regs.h.dl=dn;
intdosx(®s,®s,&segs);
SectCluster=regs.x.ax;
AvailCluster=regs.x.bx;
BytesSector=regs.x.cx;
Clusters=regs.x.dx;
*avail=(SectCluster*BytesSector/1024)*AvailCluSter;
*total=(SectCluster*BytesSectOr/1024)*Clusters;
}
|
人类存在的目的就是试图理解人类为何存在 |
|
2008-4-7 11:18 |
|
|
zxy17191
初级用户
积分 22
发帖 7
注册 2008-4-6
状态 离线
|
『第
4 楼』:
求助!!!!!!!!!!
不过,我怎么连接不上啊,用tc编译没错,就是连接有错
#include <Stdio.h>
#include <Dos.h>
#include <Ctype.h>
#include <Bios.h>
/*Prototypes*/
struct drvinfo
{
unsigned int spc; /*Sectors per cluster*/
unsigned int avail; /*Available clusters*/
unsigned int fatseg;/*FAT segment of ID byte*/
unsigned int fatoff;/*FAT offset of ID byte*/
unsigned int secsize;/*Physical sector size*/
unsigned int clusters;/*Number of clusters*/
char fatid; /*FAT ID byte*/
}info;
void get_drvinfo(char drv,struct drvinfo *info);
unsigned int get_drive(void);
void get_drvspace(char drv,struct drvinfo *info);
void main()
{
int drive;
drive=get_drive();
printf("\n\n");
printf("Current Drive Code=%u(%c:)\n",drive,'A'+drive);
printf("\n");
get_drvinfo('A'+drive,&info);
/*printf("Drive %c: information from funCtion 1Ch\n",'A'+drive);
printf("Number Of clusters=%lu\n",info.clusters);
printf("SectOrS per Cluster=%lu\n",info.spc);
printf("Physical sector Size=%lu\n",info.secsize);
printf("DriVe Size=%lu Kb\n",
(info.clusters*info.spc*info.secsize)/1024);
printf("\n");*/
get_drvspace('A'+drive,&info);
/*printf("Drive %c: informatiOn frOm function 36h\n",'A'+drive);
printf("Number of cluSterS=%lu\n",info.clusters);
printf("SectorS per cluSter=%lu\n",info.spc);
printf("PhySical sector size=%lu\n",info.secsize);
printf("Drive siZe=%lu Kb\n",
(info.clusters*info.spc*info.secsize)/1024);
printf("Available cluSters=%lu\n",info.avail);*/
printf("Available Space=%lu Kb\n",
(info.avail*info.spc*info.secsize)/1024);
Printf("\n");
}
/*Fetch the current drive code*/
unsigned int get_drive()
{
union REGS regs;
regs.h.ah=0x19;
intdos(®s,®s);
return (regs.h.al);
}
/*Fetch drive information using function 1Ch*/
void get_drvinfo(drv,info)
char drv;
struct drvinfo *info;
{
union REGS regs;
struct SREGS segs;
int dn;
/*Converts drive letter to internal representation*/
drv=toupper(drv);
dn=drv-'A'+1;
/*Set up and call DOS*/
regs.h.ah=0x1c;
regs.h.dl=dn;
intdosx(®s,®s,&segs);
info->spc=regs.h.al;
info->fatseg=segs.ds;
info->fatoff=regs.x.bx;
info->secsize=regs.x.cx;
info->clusters=regs.x.dx;
}
/*Fetch drive information using function 36h*/
void get_drvspace(drv,info)
char drv;
struct drvinfo *info;
{
union REGS regs;
struct SREGS segs;
int dn;
/*Converts drive letter to internal representation*/
drv=toupper(drv);
dn=drv-'A'+1;
/*Set up and make the DOS call*/
regs.h.ah=0x36;
regs.h.dl=dn;
intdosx(®s,®s,&segs);
info->spc=regs.x.ax;
info->avail=regs.x.bx;
info->secsize=regs.x.cx;
info->clusters=regs.x.dx;
}
|
|
2008-4-7 22:55 |
|
|
zxy17191
初级用户
积分 22
发帖 7
注册 2008-4-6
状态 离线
|
|
2008-4-7 22:56 |
|
|