美文网首页
2019-12-23 获取文件所在磁盘的信息

2019-12-23 获取文件所在磁盘的信息

作者: 崇豹 | 来源:发表于2019-12-27 15:13 被阅读0次

    statfs函数说明

    函数:

    statfs

    功能描述:

     查询文件系统相关的信息。

    用法:

    #include /* 或者 */

        int statfs(const char *path, struct statfs *buf);

        int fstatfs(int fd, struct statfs *buf);

    参数:

    path: 需要查询信息的文件系统的文件路径名。

    fd: 需要查询信息的文件系统的文件描述词

    buf:以下结构体指针变量,用于储存文件系统相关的信息

        struct statfs {

            long f_type; /* 文件系统类型 */

           long f_bsize; /* 经过优化的传输块大小 */

    long f_blocks; /* 文件系统数据块总数 */

           long f_bfree; /* 可用块数 */

    long f_bavail; /* 非超级用户可获取的块数 */

           long f_files; /* 文件结点总数 */

           long f_ffree; /* 可用文件结点数 */

           fsid_t f_fsid; /* 文件系统标识 */

            long f_namelen; /* 文件名的最大长度 */

        };

    返回说明:

    成功执行时,返回0。失败返回-1,errno被设为以下的某个值

        EACCES: (statfs())文件或路径名中包含的目录不可访问

    EBADF : (fstatfs()) 文件描述词无效

        EFAULT: 内存地址无效

        EINTR : 操作由信号中断

        EIO : 读写出错

        ELOOP : (statfs())解释路径名过程中存在太多的符号连接

        ENAMETOOLONG:(statfs()) 路径名太长

        ENOENT:(statfs()) 文件不存在

    ENOMEM: 核心内存不足

        ENOSYS: 文件系统不支持调用

        ENOTDIR:(statfs())路径名中当作目录的组件并非目录

        EOVERFLOW:信息溢出

    //说明:pDisk 路径名 如“/home”

    int DH_GetDiskfreeSpacePercent(char *pDisk){

        long long freespace = 0;

        struct statfs disk_statfs;

        long long totalspace = 0;

        float freeSpacePercent = 0 ;

        if( statfs(pDisk, &disk_statfs) >= 0 ){

            freespace = (((long long)disk_statfs.f_bsize * (long long)disk_statfs.f_bfree)/(long long)1024);

            totalspace = (((long long)disk_statfs.f_bsize * (long long)disk_statfs.f_blocks) /(long long)1024);

        }

        freeSpacePercent = ((float)freespace/(float)totalspace)*100 ;

        return freeSpacePercent ;

    }

    linux df命令实现:

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h>

    #include <errno.h>

    #include <sys/statfs.h>

    static int ok = EXIT_SUCCESS;

    static void printsize(long long n)

    {

        char unit = 'K';

        n /= 1024;

        if (n > 1024) {

          n /= 1024;

          unit = 'M';

        }

        if (n > 1024) {

          n /= 1024;

          unit = 'G';

        }

        printf("%4lld%c", n, unit);

    }

    static void df(char *s, int always) {

        struct statfs st;

        if (statfs(s, &st) < 0) {

            fprintf(stderr, "%s: %s\n", s, strerror(errno));

            ok = EXIT_FAILURE;

        } else {

            if (st.f_blocks == 0 && !always)

              return;

            printf("%-20s ", s);

            printf("%-20s ", s);

            printsize((long long)st.f_blocks * (long long)st.f_bsize);

            printf(" ");

            printsize((long long)(st.f_blocks - (long long)st.f_bfree) * st.f_bsize);

            printf(" ");

            printsize((long long)st.f_bfree * (long long)st.f_bsize);

            printf(" %d\n", (int) st.f_bsize);

        }

    }

    int main(int argc, char *argv[]) {

        printf("Filesystem Size Used Free Blksize\n");

        if (argc == 1) {

            char s[2000];

            FILE *f = fopen("/proc/mounts", "r");

            while (fgets(s, 2000, f)) {

                char *c, *e = s;

                for (c = s; *c; c++) {

                    if (*c == ' ') {

                        e = c + 1;

                        break;

                    }

                }

                for (c = e; *c; c++) {

                    if (*c == ' ') {

                        *c = '\0';

                        break;

                    }

                }

                df(e, 0);

            }

            fclose(f);

        } else {

            printf(" NO argv\n");

            int i;

            for (i = 1; i < argc; i++) {

                df(argv[i], 1);

            }

        }

        exit(ok);

    }

    https://www.cnblogs.com/elisha-blogs/p/statfs.html

    相关文章

      网友评论

          本文标题:2019-12-23 获取文件所在磁盘的信息

          本文链接:https://www.haomeiwen.com/subject/lvjdoctx.html