函數:
statfs
功能描述:
查詢文件系統相關的信息。
用法:
#include <sys/vfs.h> /* 或者 <sys/statfs.h> */
int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);
參數:
path: 需要查詢信息的文件系統的文件路徑名。
fd: 需要查詢信息的文件系統的文件描述詞。
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:信息溢出
例子:
1 //說明:pDisk 路徑名 如“/home” 2 3 int DH_GetDiskfreeSpacePercent(char *pDisk){ 4 long long freespace = 0; 5 struct statfs disk_statfs; 6 long long totalspace = 0; 7 float freeSpacePercent = 0 ; 8 9 if( statfs(pDisk, &disk_statfs) >= 0 ){ 10 freespace = (((long long)disk_statfs.f_bsize * (long long)disk_statfs.f_bfree)/(long long)1024); 11 totalspace = (((long long)disk_statfs.f_bsize * (long long)disk_statfs.f_blocks) /(long long)1024); 12 } 13 14 freeSpacePercent = ((float)freespace/(float)totalspace)*100 ; 15 return freeSpacePercent ; 16 } 17 18 linux df命令實現: 19 20 #include <stdio.h> 21 #include <stdlib.h> 22 #include <string.h> 23 #include <errno.h> 24 #include <sys/statfs.h> 25 26 static int ok = EXIT_SUCCESS; 27 28 static void printsize(long long n) 29 { 30 char unit = 'K'; 31 n /= 1024; 32 if (n > 1024) { 33 n /= 1024; 34 unit = 'M'; 35 } 36 if (n > 1024) { 37 n /= 1024; 38 unit = 'G'; 39 } 40 printf("%4lld%c", n, unit); 41 } 42 43 static void df(char *s, int always) { 44 struct statfs st; 45 46 if (statfs(s, &st) < 0) { 47 fprintf(stderr, "%s: %s\n", s, strerror(errno)); 48 ok = EXIT_FAILURE; 49 } else { 50 if (st.f_blocks == 0 && !always) 51 return; 52 printf("%-20s ", s); 53 printf("%-20s ", s); 54 printsize((long long)st.f_blocks * (long long)st.f_bsize); 55 printf(" "); 56 printsize((long long)(st.f_blocks - (long long)st.f_bfree) * st.f_bsize); 57 printf(" "); 58 printsize((long long)st.f_bfree * (long long)st.f_bsize); 59 printf(" %d\n", (int) st.f_bsize); 60 } 61 } 62 63 int main(int argc, char *argv[]) { 64 printf("Filesystem Size Used Free Blksize\n"); 65 if (argc == 1) { 66 char s[2000]; 67 FILE *f = fopen("/proc/mounts", "r"); 68 69 while (fgets(s, 2000, f)) { 70 char *c, *e = s; 71 72 for (c = s; *c; c++) { 73 if (*c == ' ') { 74 e = c + 1; 75 break; 76 } 77 } 78 79 for (c = e; *c; c++) { 80 if (*c == ' ') { 81 *c = '\0'; 82 break; 83 } 84 } 85 86 df(e, 0); 87 } 88 89 fclose(f); 90 } else { 91 printf(" NO argv\n"); 92 int i; 93 94 for (i = 1; i < argc; i++) { 95 df(argv[i], 1); 96 } 97 } 98 99 exit(ok); 100 }
