您的位置:首页 > 运维架构 > Linux

Linux下获取文件大小的方法

2017-07-24 09:25 691 查看
Linux下获取文件大小的方法

用户态下:

[cpp] view
plain copy

 print?

unsigned long get_file_size(const char *filename)  

{  

   struct stat buf;  

if(stat(filename, &buf)<0)  

{  

    return 0;  

}  

return (unsigned long)buf.st_size;  

}  

内核态下:

知识储备:

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

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

[cpp] view
plain copy

 print?

struct kstat {    

    u64     ino;    

    dev_t       dev;    

    umode_t     mode;    

    unsigned int    nlink;    

    uid_t       uid;    

    gid_t       gid;    

    dev_t       rdev;    

    loff_t      size;    

    struct timespec  atime;    

    struct timespec mtime;    

    struct timespec ctime;    

    unsigned long   blksize;    

    unsigned long long  blocks;    

};    

该结构体封装了文件的基本属性

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

[cpp] view
plain copy

 print?

int vfs_stat(char __user *name, struct kstat *stat)    

{    

    return vfs_fstatat(AT_FDCWD, name, stat, 0);    //调用了vfs_fstatat    

}    

EXPORT_SYMBOL(vfs_stat);    

函数 vfs_fstatat 定义于相同文件中

[cpp] view
plain copy

 print?

int vfs_fstatat(int dfd, char __user *filename, struct kstat *stat, int flag)    

{    

    struct path path;    

    int error = -EINVAL;    

    int lookup_flags = 0;    

    

    if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)    

        goto out;    

    

    if (!(flag & AT_SYMLINK_NOFOLLOW))    

        lookup_flags |= LOOKUP_FOLLOW;    

    

    error = user_path_at(dfd, filename, lookup_flags, &path);    

    if (error)    

        goto out;    

    

    error = vfs_getattr(path.mnt, path.dentry, stat);  //这里调用 vfs_getattr 获取文件属性    

    path_put(&path);    

out:    

    return error;    

}    

EXPORT_SYMBOL(vfs_fstatat);    

函数 vfs_getattr 定义于相同文件中

[cpp] view
plain copy

 print?

int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)    

{    

    struct inode *inode = dentry->d_inode;    

    int retval;    

    

    retval = security_inode_getattr(mnt, dentry);    

    if (retval)    

        return retval;    

    

    if (inode->i_op->getattr)    

        return inode->i_op->getattr(mnt, dentry, stat);  //通过 inode 取得文件属性    

    

    generic_fillattr(inode, stat);    

    return 0;    

}    

EXPORT_SYMBOL(vfs_getattr);    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: