Linux下获取文件大小的方法

Linux下获取文件大小的方法

用户态下:

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

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

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 定义于相同文件中

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 定义于相同文件中

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);  

使用:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值