分享

Linux下获取文件大小的方法

 心不留意外尘 2016-05-10

http://blog.csdn.net/yf210yf/article/details/8996755

2013 

Linux下获取文件大小的方法

用户态下:

  1. unsigned long get_file_size(const char *filename)  
  2. {  
  3.    struct stat buf;  
  4. if(stat(filename, &buf)<0)  
  5. {  
  6.     return 0;  
  7. }  
  8. return (unsigned long)buf.st_size;  
  9. }  

内核态下:

知识储备:

vfs_stat函数原型:int vfs_stat(char __user *name, struct kstat *stat)

struct kstat定义位于:include/fs.h

  1. struct kstat {    
  2.     u64     ino;    
  3.     dev_t       dev;    
  4.     umode_t     mode;    
  5.     unsigned int    nlink;    
  6.     uid_t       uid;    
  7.     gid_t       gid;    
  8.     dev_t       rdev;    
  9.     loff_t      size;    
  10.     struct timespec  atime;    
  11.     struct timespec mtime;    
  12.     struct timespec ctime;    
  13.     unsigned long   blksize;    
  14.     unsigned long long  blocks;    
  15. };    
该结构体封装了文件的基本属性

函数 vfs_stat 定义位于:fs/stat.c

  1. int vfs_stat(char __user *name, struct kstat *stat)    
  2. {    
  3.     return vfs_fstatat(AT_FDCWD, name, stat, 0);    //调用了vfs_fstatat    
  4. }    
  5. EXPORT_SYMBOL(vfs_stat);    

函数 vfs_fstatat 定义于相同文件中

  1. int vfs_fstatat(int dfd, char __user *filename, struct kstat *stat, int flag)    
  2. {    
  3.     struct path path;    
  4.     int error = -EINVAL;    
  5.     int lookup_flags = 0;    
  6.     
  7.     if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)    
  8.         goto out;    
  9.     
  10.     if (!(flag & AT_SYMLINK_NOFOLLOW))    
  11.         lookup_flags |= LOOKUP_FOLLOW;    
  12.     
  13.     error = user_path_at(dfd, filename, lookup_flags, &path);    
  14.     if (error)    
  15.         goto out;    
  16.     
  17.     error = vfs_getattr(path.mnt, path.dentry, stat);  //这里调用 vfs_getattr 获取文件属性    
  18.     path_put(&path);    
  19. out:    
  20.     return error;    
  21. }    
  22. EXPORT_SYMBOL(vfs_fstatat);    

函数 vfs_getattr 定义于相同文件中

  1. int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)    
  2. {    
  3.     struct inode *inode = dentry->d_inode;    
  4.     int retval;    
  5.     
  6.     retval = security_inode_getattr(mnt, dentry);    
  7.     if (retval)    
  8.         return retval;    
  9.     
  10.     if (inode->i_op->getattr)    
  11.         return inode->i_op->getattr(mnt, dentry, stat);  //通过 inode 取得文件属性    
  12.     
  13.     generic_fillattr(inode, stat);    
  14.     return 0;    
  15. }    
  16. EXPORT_SYMBOL(vfs_getattr);    

使用:



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多