如何查看电脑里的文件信息?C语言lstat函数【知识点】
图控大叔
构图传递思想
阅读从未如此简单!!!
01
前言
推文模式更改说明:为了避免单篇推文内容过长,图控大叔将尝试将测试代码与知识点部分进行分离的方式呈现,即使用两篇推文来完成内容呈现,一篇推文用于进行知识点呈现,另一篇用来承载代码。另外,在推文标题命名上尽量做到仅有【代码】二字的差别,以方便读者查找,望读者知晓!
在编程过程中,如果涉及到文件的操作,那么可能会涉及到对文件的类型、大小及使用权限等相关的判断,那么今天就分享这块所用到的函数,具体内容如下。
02
内容目录
2-1 lstat函数及其兄弟函数
2-2 参数所涉及结构体
2-3 函数判断及拓展
2-4 代码链接
2-1
lstat函数及其兄弟函数
头文件
#include <sys/stat.h>
#include <unistd.h>
lstat (由文件描述符取得文件状态)
int lstat (const char * file_name, struct stat * buf);
函数说明
lstat()与 stat()作用完全相同, 都是取得参数 file_name 所指的文件状态,
其差别在于, 当文件为符号连接时, lstat()会返回该 link 本身的状态.
返回值
执行成功则返回 0,
失败返回-1,
错误代码存于errno.
头文件与lstat相同
fstat (由文件描述符取得文件状态)
int fstat(int fildes, struct stat *buf);
函数说明
fstat()用来将参数fildes所指的文件状态,
复制到参数buf所指的结构中(struct stat).
fstat()与stat()作用完全相同,
不同处在于传入的参数为已打开的文件描述符.
返回值
执行成功则返回 0,
失败返回-1,
错误代码存于 errno.
头文件与lstat相同
stat (取得文件状态)
int stat(const char * file_name, struct stat *buf);
函数说明
stat()用来将参数 file_name 所指的文件状态,
复制到参数 buf 所指的结构中.
返回值
执行成功则返回 0,
失败返回-1,
错误代码存于 errno
错误代码
ENOENT 参数 file_name 指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目录
ELOOP 欲打开的文件有过多符号连接问题, 上限为 16 符号连接
EFAULT 参数 buf 为无效指针, 指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数 file_name 的路径名称太长
2-2
参数所涉及结构体
下面是 struct stat 内各参数的说明
struct stat
{
dev_t st_dev; //device 文件的设备编号
ino_t st_ino; //inode 文件的 i-node
mode_t st_mode; //protection 文件的类型和存取的权限
nlink_t st_nlink; //number of hard links
//连到该文件的硬连接数目, 刚建立的文件值为 1.
uid_t st_uid; //user ID of owner 文件所有者的用户识别码
gid_t st_gid; //group ID of owner 文件所有者的组识别码
dev_t st_rdev; //device type 若此文件为装置设备文件, 则为其设备编号
off_t st_size; //total size, in bytes 文件大小, 以字节计算
unsigned long st_blksize; //blocksize for filesystem I/O 文件系统的I/O 缓冲区大小
unsigned long st_blocks; //number of blocks allocated
//占用文件区块的个数, 每一区块大小为 512 个字节.
time_t st_atime; //time of lastaccess 文件最近一次被存取或被执行的时间,
//一般只有在用 mknod、utime、read、write 与 tructate 时改变.
time_t st_mtime; //time of last modification 文件最后一次被修改的时间,
//一般只有在用 mknod、utime 和 write 时才会改变
time_t st_ctime; //time of last change i-node 最近一次被更改的时间,
//此参数会在文件所有者、组、权限被更改时更新
};
2-3
函数判断及拓展
先前所描述的 st_mode 则定义了下列数种情况
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 scoket
S_IFLNK 0120000 符号连接
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置
S_IFIFO 0010000 先进先出
S_ISUID 04000 文件的 (set user-id on execution)位
S_ISGID 02000 文件的 (set group-id on execution)位
S_ISVTX 01000 文件的 sticky 位
S_IRUSR (S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR (S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR (S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限 上述的文件类型在 POSIX 中定义了检查这些类型的宏定义
S_ISLNK (st_mode) 判断是否为符号连接
S_ISREG (st_mode) 是否为一般文件
S_ISDIR (st_mode) 是否为目录
S_ISCHR (st_mode) 是否为字符装置文件
S_ISBLK (s3e) 是否为先进先出
S_ISSOCK (st_mode) 是否为 socket 若一目录具有 sticky 位 (S_ISVTX),
则表示在此目录下的文件只能被该文件所有者、此目录所有者或 root 来删除或改名.
2-4
代码链接
03
结尾
本次内容就分享到这里!