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);
用户态下:
[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);
相关文章推荐
- Linux下获取文件大小的方法
- linux获取文件大小的几种方法
- Linux下获取文件大小的方法
- Linux下获取文件大小方法汇总
- Linux下获取文件大小的方法
- Linux下获取文件大小的方法
- Linux下获取文件大小的方法
- linux下C获取文件大小的方法
- 在php.ini中设置表单上传文件的大小,以及获取设置的值的方法
- linux获取文件的路径名及其文件名的方法
- C和C++获取文件大小的方法总结(转)
- 在php.ini中设置表单上传文件的大小,以及获取设置的值的方法 .
- redhat+linux5.5下DNS配置文件获取方法+亲测
- C# 获取网络路径文件大小信息的方法
- linux获取文件大小[c]
- linux 获取文件大小
- linux下FAT和NTFS文件隐藏信息的获取方法
- ASP快速获取远程文件大小的方法
- C/C++多种方法获取文件大小
- 获取文件大小的各种方法