Linux下获取文件大小的方法

Linux下获取文件大小的方法

用户态下:

[cpp]  view plain  copy
 print ?
  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

[cpp]  view plain  copy
 print ?
  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

[cpp]  view plain  copy
 print ?
  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 定义于相同文件中

[cpp]  view plain  copy
 print ?
  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 定义于相同文件中

[cpp]  view plain  copy
 print ?
  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值