![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 11:42 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » dos下怎么用c查询剩余空间 |
| 可打印版本 1,453 / 4 |
| 第1楼 zxy17191 | 发表于 2008-04-06 17:25 |
| 初级用户 发帖 7 积分 22 | |
|
dos下怎么用c查询剩余空间 dos下怎么c查询剩余空间,我用的是pc104主板,也可以用cf卡,是否一样的查询啊
|
|
| 第2楼 zhgwbzhd | 发表于 2008-04-06 17:50 |
| 高级用户 发帖 187 积分 506 | |
|
好像有一个中断可以查询,你查一下。
|
|
| 第3楼 zyl910 | 发表于 2008-04-07 11:18 |
| 中级用户 发帖 126 积分 282 | |
|
摘自 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; } |
|
| 第4楼 zxy17191 | 发表于 2008-04-07 22:55 |
| 初级用户 发帖 7 积分 22 | |
|
求助!!!!!!!!!! 不过,我怎么连接不上啊,用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; } |
|
| 第5楼 zxy17191 | 发表于 2008-04-07 22:56 |
| 初级用户 发帖 7 积分 22 | |
|
谢谢 谢谢楼上的
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |