为了实现某些功能,实现了这个函数,封装了几个接口
/**
* @file statfs.c
* @brief get disk infomation
* @author T-bagwell@ChinaUnix.net
* @date 2009-12-12
*/
# include < stdio. h>
# include < stdlib. h>
# include < string . h>
# include < sys/ vfs. h>
struct disk_infomation{
char disk_format[ 8] ;
char disk_total_capacity[ 11] ;
char disk_free_capacity[ 11] ;
char disk_permissions[ 3] ;
} ;
static int get_disk_infomation( const char * path, struct disk_infomation * di) ;
static char * convert_size( float size, char * dest) ;
static unsigned long kscale( unsigned long b, unsigned long bs) ;
int main( int argc, char * argv[ ] )
{
struct disk_infomation * di= malloc ( sizeof ( struct disk_infomation) ) ;
char * path = ( char * ) malloc ( 20) ;
if ( argc < 2)
{
printf ( "%s Mount point of the dir/n" , argv[ 0] ) ;
return 0;
}
strncpy ( path, argv[ 1] , strlen ( argv[ 1] ) ) ;
get_disk_infomation( path, di) ;
printf ( "DiskType: %s/n" , di- > disk_format) ;
printf ( "DiskTotalCapacity %s/n" , di- > disk_total_capacity) ;
printf ( "DiskFreeCapacity %s/n" , di- > disk_free_capacity) ;
printf ( "DiskPermissions %s/n" , di- > disk_permissions) ;
free ( di) ;
free ( path) ;
return 0;
}
/**
* @brief block to byte
* @param b block
* @param bs KByte
* @return Kbyte
*/
static unsigned long kscale( unsigned long b, unsigned long bs)
{
return ( b * ( unsigned long long ) bs + 1024/ 2) / 1024;
}
/**
* @brief get disk informations
* @param path the disk mount point
* @param di the structure of the disk information
* @return success: 1, faild: 0
*/
static int get_disk_infomation( const char * path,
struct disk_infomation * di)
{
struct statfs buf;
int i= 0;
float disk_total_size = 0;
float disk_free_size = 0;
i= statfs( path, & buf) ;
if ( i < 0) {
printf ( "get disk infomation faild/n" ) ;
return 0;
}
switch ( buf. f_type)
{
memset ( di- > disk_format, 0, 8) ;
case 0x4d44:
sprintf ( di- > disk_format, "FAT" ) ;
break ;
case 0x5346544e:
case 0X65735546:
sprintf ( di- > disk_format, "NTFS" ) ;
break ;
case 0xEF53:
case 0xEF51:
sprintf ( di- > disk_format, "EXT2" ) ;
break ;
default :
sprintf ( di- > disk_format, "unknown" ) ;
break ;
}
memset ( di- > disk_total_capacity, 0, 10) ;
memset ( di- > disk_free_capacity, 0, 10) ;
disk_total_size =
( float ) ( kscale( buf. f_blocks, buf. f_bsize) ) ;
disk_free_size =
( float ) ( kscale( buf. f_bfree, buf. f_bsize) ) ;
convert_size( disk_total_size, di- > disk_total_capacity) ;
convert_size( disk_free_size, di- > disk_free_capacity) ;
memset ( di- > disk_permissions, 0, 3) ;
sprintf ( di- > disk_permissions, "rw/n" ) ;
return 1;
}
/**
* @name convert_size
* @brief convert size to GB MB KB
* size: the size
* dest: the return size like string
* @author JerryLeo
* @date 2009-12-12
*/
static char * convert_size( float size, char * dest)
{
if ( ( ( ( size/ 1024. 0) / 1024. 0) ) > = 1. 0) {
sprintf ( dest, "%0.2fGB" , ( ( size/ 1024. 0) / 1024. 0) ) ;
}
else if ( ( ( size/ 1024. 0) ) > = 1. 0) {
sprintf ( dest, "%0.2fMB" , ( size/ 1024. 0) ) ;
}
else {
sprintf ( dest, "%0.2fKB" , size) ;
}
return dest;
}
转自:http://blog.chinaunix.net/u3/101042/showart_2119387.html