Linux文件大小 指令&編程


在工作和日常的編程中時常需要確定文件的大小,一些基本的查看方式在此做一個總結。

一. 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 這個分割區被掛在根目錄下。

    接下來的四個字段 SizeUsedAvail、及 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;

}

結構體定義如下:

  1. struct stat     
  2. {     
  3. dev_t       st_dev;     /* ID of device containing file -文件所在設備的ID*/     
  4. ino_t       st_ino;     /* inode number -inode節點號*/   
  5. mode_t      st_mode;    /* 文件的類型和存取的權限*/     
  6. nlink_t     st_nlink;   /* number of hard links -鏈向此文件的連接數(硬連接)*/     
  7. uid_t       st_uid;     /* user ID of owner -user id*/     
  8. gid_t       st_gid;     /* group ID of owner - group id*/     
  9. dev_t       st_rdev;    /* device ID (if special file) -設備號,針對設備文件*/     
  10. off_t       st_size;    /* total size, in bytes -文件大小,字節為單位*/     
  11. blksize_t   st_blksize; /* blocksize for filesystem I/O -系統塊的大小*/     
  12. blkcnt_t    st_blocks;  /* number of blocks allocated -文件所占塊數*/     
  13. time_t      st_atime;   /* time of last access -最近存取時間*/     
  14. time_t      st_mtime;   /* time of last modification -最近修改時間*/     
  15. time_t      st_ctime;   /* time of last status change - */     
  16. };  
  17. 其中, st_mode這個變量用來判斷文件類型。
  18. st_mode是用特征位來表示文件類型的,特征位的定義如下:

 

  1. S_IFMT      0170000     文件類型的位遮罩   
  2. S_IFSOCK    0140000     socket   
  3. S_IFLNK     0120000     符號鏈接(symbolic link)   
  4. S_IFREG     0100000     一般文件   
  5. S_IFBLK     0060000     區塊裝置(block device)   
  6. S_IFDIR     0040000     目錄   
  7. S_IFCHR     0020000     字符裝置(character device)   
  8. S_IFIFO     0010000     先進先出(fifo)   
  9. S_ISUID     0004000     文件的(set user-id on execution)   
  10. S_ISGID     0002000     文件的(set group-id on execution)   
  11. S_ISVTX     0001000     文件的sticky   
  12. S_IRWXU     00700       文件所有者的遮罩值(即所有權限值)   
  13. S_IRUSR     00400       文件所有者具可讀取權限   
  14. S_IWUSR     00200       文件所有者具可寫入權限   
  15. S_IXUSR     00100       文件所有者具可執行權限   
  16. S_IRWXG     00070       用戶組的遮罩值(即所有權限值)   
  17. S_IRGRP     00040       用戶組具可讀取權限   
  18. S_IWGRP     00020       用戶組具可寫入權限   
  19. S_IXGRP     00010       用戶組具可執行權限   
  20. S_IRWXO     00007       其他用戶的遮罩值(即所有權限值)   
  21. S_IROTH     00004       其他用戶具可讀取權限   
  22. S_IWOTH     00002       其他用戶具可寫入權限   
  23. S_IXOTH     00001       其他用戶具可執行權限   
  24. 摘自《Linux C 函數庫參考手冊》   

判斷文件類型時,用對文件的st_mode的值與上面給出的值相與,再比較。比如:

  1. #include <sys/stat.h>   
  2. #include <unistd.h>   
  3. #include <stdio.h>   
  4. int main()   
  5. {   
  6. int abc;   
  7. struct stat buf;   
  8. stat("/home", &buf);   
  9. abc = buf.st_mode & S_IFDIR;//與對應的標志位相與   
  10. if(abc == S_IFDIR)          //結果與標志位比較   
  11. printf("It's a directory.\n");   
  12. return 0;   
  13. }   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM