vlambda博客
学习文章列表

如何查看电脑里的文件信息?C语言lstat函数【知识点】



图控大叔

构图传递思想

阅读从未如此简单!!!



01

前言


       推文模式更改说明:为了避免单篇推文内容过长,图控大叔将尝试将测试代码知识点部分进行分离的方式呈现,即使用两篇推文来完成内容呈现,一篇推文用于进行知识点呈现,另一篇用来承载代码。另外,在推文标题命名上尽量做到仅有【代码】二字的差别,以方便读者查找,望读者知晓!


       在编程过程中,如果涉及到文件的操作,那么可能会涉及到对文件的类型、大小及使用权限等相关的判断,那么今天就分享这块所用到的函数,具体内容如下。



02

内容目录


2-1 lstat函数及其兄弟函数

2-2 参数所涉及结构体

2-3 函数判断及拓展

2-4 代码链接


2-1

lstat函数及其兄弟函数

如何查看电脑里的文件信息?C语言lstat函数【知识点】
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.


如何查看电脑里的文件信息?C语言lstat函数【知识点】
fstat
头文件与lstat相同

fstat (由文件描述符取得文件状态)

int fstat(int fildes, struct stat *buf);

函数说明
    fstat()用来将参数fildes所指的文件状态,
    复制到参数buf所指的结构中(struct stat).
    fstat()与stat()作用完全相同,
    不同处在于传入的参数为已打开的文件描述符.

返回值
  执行成功则返回 0,
  失败返回-1,
  错误代码存于 errno.


stat
头文件与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

结尾


       本次内容就分享到这里!