实地代码

[maintenance@localhost ~]$ python
Python 2.7.5 (default, Nov 6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import statvfs
>>> vfs = os.statvfs("/home")
>>> vfs
posix.statvfs_result(f_bsize=4096, f_frsize=4096, f_blocks=521728, f_bfree=144359, f_bavail=144359, f_files=1048576, f_ffree=1005229, f_favail=1005229, f_flag=4096, f_namemax=255)
>>> dir(statvfs)
['F_BAVAIL', 'F_BFREE', 'F_BLOCKS', 'F_BSIZE', 'F_FAVAIL', 'F_FFREE', 'F_FILES', 'F_FLAG', 'F_FRSIZE', 'F_NAMEMAX', '__builtins__', '__doc__', '__file__', '__name__', '__package__']
>>> available=vfs[statvfs.F_BAVAIL]*vfs[statvfs.F_BSIZE]/(1024*1024*1024)
>>> available
0
>>> available=vfs[statvfs.F_BAVAIL]*vfs[statvfs.F_BSIZE]/(1024*1024)
>>> available
563
>>> capacity=vfs[statvfs.F_BLOCKS]*vfs[statvfs.F_BSIZE]/(1024*1024)
>>> capacity
2038
>>> used=capacity-available
>>> used
1475
 

参数

  • path -- 文件路径。

返回值

返回的结构:

  • f_bsize: 文件系统块大小

  • f_frsize: 分栈大小

  • f_blocks: 文件系统数据块总数

  • f_bfree: 可用块数

  • f_bavail:非超级用户可获取的块数

  • f_files: 文件结点总数

  • f_ffree: 可用文件结点数

  • f_favail: 非超级用户的可用文件结点数

  • f_fsid: 文件系统标识 ID

  • f_flag: 挂载标记

  • f_namemax: 最大文件长度

statvfs的数据结构,成员信息

struct statvfs {
  unsigned long  f_bsize;    /* file system block size */
  unsigned long  f_frsize;   /* fragment size */
  fsblkcnt_t     f_blocks;   /* size of fs in f_frsize units */
  fsblkcnt_t     f_bfree;    /* # free blocks */
  fsblkcnt_t     f_bavail;   /* # free blocks for non-root */
  fsfilcnt_t     f_files;    /* # inodes */
  fsfilcnt_t     f_ffree;    /* # free inodes */
  fsfilcnt_t     f_favail;   /* # free inodes for non-root */
  unsigned long  f_fsid;     /* file system ID */
  unsigned long  f_flag;     /* mount flags */
  unsigned long  f_namemax;  /* maximum filename length */
};

使用statvfs读取文件系统信息

///文件操作偏移地址启用64位形式
#define _FILE_OFFSET_BITS 64

#include <stdio.h>
#include <sys/statvfs.h>

typedef enum {
    TOTAL_SIZE,///文件系统的大小
    FREE_SIZE, ///自由空间
    USED_SIZE, ///已用空间
    AVAIL_SIZE ///用户实际可以使用的空间
}VFsize;

//把数字大小转换成字符形式
char *
byte_size_to_string(fsblkcnt_t size)
{
    const double k = 1024;
    const double m = k*1024;
    const double g = m*k;

static char size_str[128] = {0};

if(size>=g)
        sprintf(size_str,"%0.2lf GB",size/g);
    else if(size>=m)
        sprintf(size_str,"%0.2lf MB",size/m);
    else if(size>=k)
        sprintf(size_str,"%0.2lf KB",size/k);
    else
        sprintf(size_str,"%0.0lf Byte",size>=0?size:0.0);

return size_str;
}

///文件系统的各种信息数据的大小
fsblkcnt_t
get_vfs_size(struct statvfs *buf,VFsize flag)
{
    fsblkcnt_t block;
    fsblkcnt_t bsize;

bsize = buf->f_bsize;

switch (flag){
    case TOTAL_SIZE:
        block = buf->f_blocks;
    break;
    case FREE_SIZE:
        block = buf->f_bfree;
    break;
    case USED_SIZE:
        block = buf->f_blocks - buf->f_bavail;
    break;
    case AVAIL_SIZE:
        block = buf->f_bavail;
    break;
    default:
        block = 0;
    break;
    }

return  bsize * block;
}

int main(int argc, char **argv)
{
    char *pathname;
    struct statvfs buf;
    fsblkcnt_t total_size;
    fsblkcnt_t used_size;
    fsblkcnt_t avail_size;
    int error;

pathname = "/";
    if(argc>1){
        pathname = argv[1];
    }

//把文件系统信息读入 struct statvfs buf 中
    error = statvfs(pathname,&buf);

//错误检查
    if(error <0){
        fprintf(stderr,"statvfs():%m\n");
        return error;
    }

//输出结果,此结果与gparted一致,与df出入较大
    printf("FileSystem of \'%s\':\n",pathname);

total_size = get_vfs_size(&buf,TOTAL_SIZE);
    printf("       total:%s\n",byte_size_to_string(total_size));

used_size = get_vfs_size(&buf,USED_SIZE);
    printf("       used :%s\n",byte_size_to_string(used_size));

avail_size = get_vfs_size(&buf,AVAIL_SIZE);
    printf("       Avail:%s\n",byte_size_to_string(avail_size));

return 0;
}

2017.7.21 python statvfs方法读取磁盘容量的更多相关文章

  1. 深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  2. python linecache模块读取文件的方法

    转自: python linecache模块读取文件 在Python中,有个好用的模块linecache,该模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行. l ...

  3. Python os.statvfs() 方法

    概述 os.statvfs() 方法用于返回包含文件描述符fd的文件的文件系统的信息.高佣联盟 www.cgewang.com 语法 statvfs()方法语法格式如下: os.statvfs([pa ...

  4. 重拾Python(5):数据读取

    本文主要对Python如何读取数据进行总结梳理,涵盖从文本文件,尤其是excel文件(用于离线数据探索分析),以及结构化数据库(以Mysql为例)中读取数据等内容. 约定: import numpy ...

  5. Python str方法总结

    1.返回第一个字母大写 S.capitalize(...) S.capitalize() -> string 1 2 3 4 >>>a = 'shaw' >>> ...

  6. python中逐行读取文件的最佳方式_Drupal_新浪博客

    python中逐行读取文件的最佳方式_Drupal_新浪博客 python中逐行读取文件的最佳方式    (2010-08-18 15:59:28)    转载▼    标签:    python   ...

  7. 二十一. Python基础(21)--Python基础(21)

    二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性:     #类.属性: 调用的就是类中的属性     #对象.属性: 先从自己的内存空间里找名 ...

  8. python使用xlrd读取excel数据时,整数变小数的解决办法

    python使用xlrd读取excel数据时,整数变小数: 解决方法: 1.有个比较简单的就是在数字和日期的单元格内容前加上一个英文的逗号即可.如果数据比较多,也可以批量加英文逗号的前缀(网上都有方法 ...

  9. Python String 方法详解

    官网文档地址:https://docs.python.org/3/library/stdtypes.html#string-methods 官网 公号:软测小生ruancexiaosheng 文档里的 ...

随机推荐

  1. UVa LA 3029 City Game 状态拆分,最大子矩阵O(n2) 难度:2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  2. Java 算法(背包,队列和栈)

    Dijkstra的双栈算术表达式求值算法: import java.util.*; public class Main { public static double evaluate(String a ...

  3. Linux学习 :移植linux-3.4.83到JZ2440开发板

    一.编译环境搭建: 1.linux源码下载:https://www.kernel.org/ (最新)  https://mirrors.edge.kernel.org/pub/linux/kernel ...

  4. 《图解HTTP》读书笔记(转)

    reference:https://www.cnblogs.com/edisonchou/p/6013450.html   目前国内讲解HTTP协议的书是在太少了,记忆中有两本被誉为经典的书<H ...

  5. 玩转X-CTR100 l STM32F4 l MPU6050加速度陀螺仪传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 板载加速度 ...

  6. L304 What Is Death?

    How should we define the death of a person? Philosophers and physicians have long pondered this ques ...

  7. leetcode57:插入区间

    给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: intervals = [ ...

  8. Flask源码阅读-第四篇(flask\app.py)

    flask.app该模块2000多行代码,主要完成应用的配置.初始化.蓝图注册.请求装饰器定义.应用的启动和监听,其中以下方法可以重点品读和关注 def setupmethod(f): @setupm ...

  9. select语句的高级应用及实例

    本文介绍的select高级应用主要包括:联合查询.分组查询.嵌套查询和限定查询数目等,与实例对照演示,所使用数据库为sqlite3. 部门表(dept) CREATE TABLE dept( id I ...

  10. php CURL 发送get,post请求

    // 发送一个get请求 $url 发送地址    function get($url)    {        //初始化操作        $curl = curl_init($url);     ...