查詢磁盤空間 statfs函數

因爲要讀取SD卡的大小和使用情況,所以用到statfs這個函數,功能類似於df命令。

需要的頭文件:#include <sys/vfs.h> 

int statfs(const char *path, struct statfs *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:信息溢出

example:

#include <sys/vfs.h>
#include <stdio.h>
 
int main()
{
    struct statfs diskInfo;
 
    //statfs("/media/card",&diskInfo);
	statfs("/dev",&diskInfo);
    
	unsigned long long blocksize = diskInfo.f_bsize;// 每個block裏面包含的字節數
    
	unsigned long long totalsize = blocksize*diskInfo.f_blocks;//總的字節數
	char totalsize_GB[10]={0};
    printf("TOTAL_SIZE == %llu KB  %llu MB  %llu GB\n",totalsize>>10,totalsize>>20,totalsize>>30); // 分別換成KB,MB,GB爲單位
	sprintf(totalsize_GB,"%.2f",(float)(totalsize>>20)/1024);
	printf("totalsize_GB=%s\n",totalsize_GB);
	
	
 
 
    unsigned long long freesize = blocksize*diskInfo.f_bfree; //再計算下剩餘的空間大小
	
    printf("DISK_FREE == %llu KB  %llu MB  %llu GB\n",freesize>>10,freesize>>20,freesize>>30);
	
	unsigned long long usedsize = blocksize*(diskInfo.f_blocks - diskInfo.f_bfree);
	char usedsize_GB[10]={0};
	sprintf(usedsize_GB,"%.2f",(float)(usedsize>>20)/1024);
	printf("usedsize_GB=%s\n",usedsize_GB);
	
 
 
 return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章