Linux下获取文件大小的方法

来源:互联网 发布:linux上安装oracle11g 编辑:程序博客网 时间:2024/06/01 08:24

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);    
原创粉丝点击