中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: dos下怎么用c查询剩余空间 上一主题 | 下一主题
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(&regs,&regs);
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(&regs,&regs,&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(&regs,&regs,&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(&regs,&regs);
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(&regs,&regs,&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(&regs,&regs,&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
状态 离线
『第 5 楼』:  谢谢

谢谢楼上的

2008-4-7 22:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: