在工作和日常的編程中時常需要確定文件的大小,一些基本的查看方式在此做一個總結。
一. linux shell環境下
df可以查看一級文件夾大小、使用比例、檔案系統及其掛入點,但對文件卻無能為力。
du可以查看文件及文件夾的大小。
兩者配合使用,非常有效。比如用df查看哪個一級目錄過大,然后用df查看文件夾或文件的大小,如此便可迅速確定症結。
下面分別簡要介紹
df命令可以顯示目前所有文件系統的可用空間及使用情形
-bash-4.1$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_sporsay-lv_root
50G 8.9G 38G 20% /
tmpfs 127G 216K 127G 1% /dev/shm
/dev/sda2 477M 42M 410M 10% /boot
/dev/sda1 200M 264K 200M 1% /boot/efi
/dev/mapper/vg_sporsay-lv_home
4.7T 1.7T 2.8T 38% /home9306144 38% /home
上面的命令輸出的第一個字段(Filesystem)及最后一個字段(Mounted on)分別是檔案系統及其掛入點。我們可以看到 /dev/sda1 這個分割區被掛在根目錄下。
接下來的四個字段 Size、Used、Avail、及 Use% 分別是該分割區的容量、已使用的大小、剩下的大小、及使用的百分比。 FreeBSD下,當硬盤容量已滿時,您可能會看到已使用的百分比超過 100%,因為 FreeBSD 會留一些空間給 root,讓 root 在檔案系統滿時,還是可以寫東西到該檔案系統中,以進行管理。
du:查詢文件或文件夾的磁盤使用空間
~/net$ du -h --max-depth=1
60K ./socket
20K ./pyofwebserver
88K ./test
29M .
查看linux文件目錄的大小和文件夾包含的文件數
統計總數大小
du -sh xmldb/
du -sm * | sort -n //統計當前目錄大小 並安大小 排序
du -sk * | sort -n
du -sk * | grep guojf //看一個人的大小
du -m | cut -d "/" -f 2 //看第二個/ 字符前的文字
查看此文件夾有多少文件 /*/*/* 有多少文件
du xmldb/
du xmldb/*/*/* |wc -l
40752
解釋:
wc [-lmw]
參數說明:
-l :多少行
-m:多少字符
-w:多少字
二.編程統計文件字符數
誠然,在統計文件字符數的時候可以通過讀取文件過程中文件指針移動情況得出文件字符數,但是對於大文件這種方法就顯得十分耗費時間及CPU資源,例如:
unsigned long get_file_size(const char *path)
{
unsigned long filesize = -1;
FILE *fp;
fp = fopen(path, "r");
if(fp == NULL)
return filesize;
fseek(fp, 0L, SEEK_END);
filesize = ftell(fp);
fclose(fp);
return filesize;
}
還有一個較為快捷的辦法是通過文件的屬性描述得到文件的大小以及一切其他的信息,使用方法如下:
#include <sys/stat.h>
unsigned long get_file_size(const char *path)
{
unsigned long filesize = -1;
struct stat statbuff;
if(stat(path, &statbuff) < 0){
return filesize;
}else{
filesize = statbuff.st_size;
}
return filesize;
}
結構體定義如下:
- struct stat
- {
- dev_t st_dev; /* ID of device containing file -文件所在設備的ID*/
- ino_t st_ino; /* inode number -inode節點號*/
- mode_t st_mode; /* 文件的類型和存取的權限*/
- nlink_t st_nlink; /* number of hard links -鏈向此文件的連接數(硬連接)*/
- uid_t st_uid; /* user ID of owner -user id*/
- gid_t st_gid; /* group ID of owner - group id*/
- dev_t st_rdev; /* device ID (if special file) -設備號,針對設備文件*/
- off_t st_size; /* total size, in bytes -文件大小,字節為單位*/
- blksize_t st_blksize; /* blocksize for filesystem I/O -系統塊的大小*/
- blkcnt_t st_blocks; /* number of blocks allocated -文件所占塊數*/
- time_t st_atime; /* time of last access -最近存取時間*/
- time_t st_mtime; /* time of last modification -最近修改時間*/
- time_t st_ctime; /* time of last status change - */
- };
- 其中, st_mode這個變量用來判斷文件類型。
- st_mode是用特征位來表示文件類型的,特征位的定義如下:
- S_IFMT 0170000 文件類型的位遮罩
- S_IFSOCK 0140000 socket
- S_IFLNK 0120000 符號鏈接(symbolic link)
- S_IFREG 0100000 一般文件
- S_IFBLK 0060000 區塊裝置(block device)
- S_IFDIR 0040000 目錄
- S_IFCHR 0020000 字符裝置(character device)
- S_IFIFO 0010000 先進先出(fifo)
- S_ISUID 0004000 文件的(set user-id on execution)位
- S_ISGID 0002000 文件的(set group-id on execution)位
- S_ISVTX 0001000 文件的sticky位
- S_IRWXU 00700 文件所有者的遮罩值(即所有權限值)
- S_IRUSR 00400 文件所有者具可讀取權限
- S_IWUSR 00200 文件所有者具可寫入權限
- S_IXUSR 00100 文件所有者具可執行權限
- S_IRWXG 00070 用戶組的遮罩值(即所有權限值)
- S_IRGRP 00040 用戶組具可讀取權限
- S_IWGRP 00020 用戶組具可寫入權限
- S_IXGRP 00010 用戶組具可執行權限
- S_IRWXO 00007 其他用戶的遮罩值(即所有權限值)
- S_IROTH 00004 其他用戶具可讀取權限
- S_IWOTH 00002 其他用戶具可寫入權限
- S_IXOTH 00001 其他用戶具可執行權限
- 摘自《Linux C 函數庫參考手冊》
判斷文件類型時,用對文件的st_mode的值與上面給出的值相與,再比較。比如:
- #include <sys/stat.h>
- #include <unistd.h>
- #include <stdio.h>
- int main()
- {
- int abc;
- struct stat buf;
- stat("/home", &buf);
- abc = buf.st_mode & S_IFDIR;//與對應的標志位相與
- if(abc == S_IFDIR) //結果與標志位比較
- printf("It's a directory.\n");
- return 0;
- }
