linux 获取文件系统信息(磁盘信息)

源码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/vfs.h>

//文件系统信息结构体
struct fileSystem_info{
    char fileSystem_format[8];
    char fileSystem_total_capacity[11];
    char fileSystem_free_capacity[11];
    char fileSystem_permissions[3];
};

/*获取文件系统信息*/
int get_fileSystem_info(const char *fileSystem_name, struct fileSystem_info *fi);

/*block to kbyte*/
static unsigned long kscale(unsigned long m_block, unsigned long m_kbyte);

/*convert size to GB MB KB*/
static char *convert_size(float m_size, char *dest);

int main()
{
    char buf[1024];
    struct fileSystem_info fileSysInfo;
    get_fileSystem_info("/",&fileSysInfo);

    printf("%s\n",fileSysInfo.fileSystem_format);
    printf("%s\n",fileSysInfo.fileSystem_free_capacity);
    printf("%s\n",fileSysInfo.fileSystem_total_capacity);
    printf("%s\n",fileSysInfo.fileSystem_permissions);

    return 0;
}

/*获取文件系统信息*/
int get_fileSystem_info(const char *fileSystem_name,struct fileSystem_info *fi)
{
    struct statfs buf;
    float fileSystem_total_size = 0;
    float fileSystem_free_size = 0;

    if(statfs(fileSystem_name,&buf))
    {
        fprintf(stderr,"statfs %s\n",strerror(errno));
        return -1;
    }

    switch(buf.f_type)
    {
    case 0xEF51:
    case 0xEF53:
        sprintf(fi->fileSystem_format,"EXT");
        break;

    case 0x4d44:
        sprintf(fi->fileSystem_format,"FAT");
        break;

    case 0x5346544e:
        sprintf(fi->fileSystem_format,"NIFS");
        break;

    default:
        sprintf(fi->fileSystem_format,"unknown");
        break;
    }

    bzero(&fi->fileSystem_total_capacity,sizeof(fi->fileSystem_total_capacity));
    bzero(&fi->fileSystem_free_capacity,sizeof(fi->fileSystem_free_capacity));

    printf("blocks %ld\n",buf.f_blocks);
    printf("bfree %ld\n",buf.f_bfree);
    printf("bsize %ld\n",buf.f_bsize);

    fileSystem_total_size =
                    (float)(kscale(buf.f_blocks, buf.f_bsize));
    fileSystem_free_size =
                    (float)(kscale(buf.f_bfree, buf.f_bsize));

    printf("total %f\n",fileSystem_total_size);
    printf("free %f\n",fileSystem_free_size);

    convert_size(fileSystem_total_size,fi->fileSystem_total_capacity);
    convert_size(fileSystem_free_size,fi->fileSystem_free_capacity);

    bzero(fi->fileSystem_permissions,sizeof(fi->fileSystem_permissions));
    sprintf(fi->fileSystem_permissions,"rw");

    return 0;
}

/*block to kbyte*/
static unsigned long kscale(unsigned long m_block, unsigned long m_kbyte)
{

    return ((unsigned long long) m_block * m_kbyte + 1024 / 2 ) /1024;
}

/*convert size to GB MB KB*/
static char *convert_size(float m_size, char *dest)
{
    if((((m_size / 1024.0) / 1024.0)) >= 1.0)
    {
        sprintf(dest,"%0.2fGB",(m_size/1024.0)/1024.0);
    }
    else if((m_size / 1024.0) >= 1.0)
    {
        sprintf(dest,"%0.2fMB",(m_size/1024));
    }
    else
    {
        sprintf(dest,"%0.2fKB",m_size);
    }

    return dest;
}

总结:

1、关于 struct statfs 结构体信息参考:http://blog.csdn.net/u011641885/article/details/46919027

2、对于fileSystem_total_size 使用float 类型,是为了精确度更高。buysbox 中的 fdisk 源码使用的是整型相除,约为4舍五入。

3、kscale 函数中 使用 unsigned long long 类型 是因为 m_block 与 m_byte 原本是long 型,相乘的结果超出了 long 类型的可以表示数据位。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 00:31:34

linux 获取文件系统信息(磁盘信息)的相关文章

C# 获取文件详细备注信息 (如图片、视频实际创建时间)

在整理照片/视频时想根据实际拍摄时间重命名文件,但 System.IO.FileInfo 只能获取到文件的创建时间或最后写入时间,不符合要求,遂寻找解决方案 方案 1: System.Drawing c#从相机拍摄的照片中提取拍摄时间 static void Main(string[] args) { var file = @"D:\image\IMG_6789.JPG"; var image = Image.FromFile(file); var propItems = image.

fsck获取文件的block信息和位置信息

原文链接:lxw的大数据田地 » hdfs fsck命令查看HDFS文件对应的文件块信息(Block)和位置信息(Locations) 关键字:hdfs fsck.block.locations 在HDFS中,提供了fsck命令,用于检查HDFS上文件和目录的健康状态.获取文件的block信息和位置信息等. fsck命令必须由HDFS超级用户来执行,普通用户无权限. [[email protected] ~]$ hdfs fsck Usage: DFSck [-list-corruptfileb

Linux获取文件信息

项目中需要对文件进行处理并分析,首先需要根据要求找到该文件,比如最后修改的文件 代码实现: 1 #include <unistd.h> 2 #include <sys/stat.h> 3 #include <time.h> 4 5 #include <iostream> 6 7 using namespace std; 8 9 int main(int argc, char **argv) 10 { 11 struct stat STFile; 12 sta

Linux 获取命令的帮助信息

?大家好,我是ZYJTF 孤云暮雨,好久没写博客了,今天给大家带来的是"如何获取Linux命令的使用帮助信息" 查询内部命令:help COMMAND...??help是一个内部命令,用于输出shell所有的内部命令和shell内部命令的使用帮助信息??使用语法:????输出shell所有的内部命令:help????输出shell内部命令的使用帮助信息:help COMMAND...????????????????????help 选项 COMMAND...?????# COMMAND

linux获取命令的帮助信息

判断一个命令是否是Linux内置的,可以用type命令,只有Linux的内置命令才能使用 help 命令获得帮助.# type cd输出:cd is a shell builtin说明这个命令是系统自带的内置命令,那么就可以使用 help命令来获取帮助. # help 命令名 <二>.外部命令获取帮助文档的方式: (1) 第一种办法是使用 --help 格式:# 命令名 --help 例如:# mkdir --help (2) 想要获取命令的完整帮助可以使用 man 命令 格式:# man 命

003、java连接Hadoop2.5.1获取文件系统信息

说明:hadoop安装,一共有三种部署方式,分别是本地部署.伪分布部署.集群部署.这里我们以伪分布模式为例进行讲解. 软件:Myeclipse-2014-GA,hadoop-2.5.1.tar.gz,hadoop-eclipse-plugin-2.5.0.jar 软件下载地址:链接: http://pan.baidu.com/s/1ntuUhux 密码: stok 1.首先把hadoop-eclipse-plugin-2.5.0.jar拷贝到Myeclipse的插件目录里面 2.启动myecli

linux获取文件全路径的方法

获取路径的各种相关方法: 获取文件名: basename /home/cuizhiliang344/note.txt note.txt 获取目录: dirname /home/cuizhiliang344/note.txt /home/cuizhiliang344 通过一个文件获取全路径 方法一: readlink -f  note.txt /home/cuizhiliang344/note.txt 方法二: python -c 'import os; print(os.path.abspath

用SHGetFileInfo获取文件类型/图标信息

SHFILEINFO fileInfo; SHGetFileInfo( "C:\\boot.ini", NULL, &fileInfo, sizeof(SHFILEINFO), SHGFI_ICON|SHGFI_TYPENAME); cout<<fileInfo.szTypeName<<"文件"<<endl; cout<<"0x"<<hex<<fileInfo.hIc

linux删除文件后磁盘空间未释放的问题

很可能是该文件还被其它进程使用. 使用: lsof | grep deleted | grep $FILE_NAME 可以看到正使用该文件的进程,将之kill即可.也可以查看进程来验证: ls -l /proc/3446