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. }   

 

posted @ 2017-10-29 10:45  Edver  阅读(2840)  评论(0编辑  收藏  举报