|   
zxy17191 
初级用户
 
  
 
  
  
积分 22 
发帖 7 
注册 2008-4-6 
状态 离线
 | 
『楼 主』:
 dos下怎么用c查询剩余空间
 
使用 LLM 解释/回答一下
  
dos下怎么c查询剩余空间,我用的是pc104主板,也可以用cf卡,是否一样的查询啊 
 
    
 
  
 |   
 |  
  2008-4-6 17:25 | 
  
 |  
 |   
zhgwbzhd 
高级用户
 
    
 
  
  
积分 506 
发帖 187 
注册 2005-12-4 
状态 离线
 | 
 |  
  2008-4-6 17:50 | 
  
 |  
 |   
zyl910 
中级用户
 
   
 
  
  
积分 282 
发帖 126 
注册 2006-5-17 
状态 离线
 | 
『第 3 楼』:
 
 
使用 LLM 解释/回答一下
  
摘自 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 楼』:
 求助!!!!!!!!!!
 
使用 LLM 解释/回答一下
  
不过,我怎么连接不上啊,用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 | 
  
 |  
  |