• 使用 lstat 函数获取文件信息


    前言

      在之前的文章中,描述过如何用 fcntl 函数改变文件的状态标记。但,文件还有很多信息,如文件类型,权限设置,设备编号,访问时间等等。如果要获取这些信息,则使用函数 lstat 可以轻松达到这个目的。

      下面的程序将使用该函数获取文件类型信息并判断它的类型

      但在这之前,先要说明文件信息结构体文件类型判定宏

    文件信息结构体

      调用 lstat 函数将会把指定文件的信息存放到 stat 结构体中,这个结构体的定义大致如下:

      

    文件类型判定宏

      文件结构体中的文件类型字段是一个整数,对此,可以使用如下判定宏来获知判定对象所属的文件类型:

      

    代码示例

     1 #include "apue.h"
     2 
     3 int
     4 main(int argc, char *argv[])
     5 {
     6     int            i;
     7     struct stat    buf;
     8     char        *ptr;
     9 
    10     for (i = 1; i < argc; i++) {
    11         // 输出要判断的文件名    
    12         printf("%s: ", argv[i]);
    13 
    14         // 执行 lstat 函数后,文件的信息就存放在了结构体 buf 中。
    15         if (lstat(argv[i], &buf) < 0) {
    16             err_ret("lstat error");
    17             continue;
    18         }
    19             
    20         // 执行判定宏,对结构体中的文件类型变量进行判定。
    21         if (S_ISREG(buf.st_mode))
    22             ptr = "regular";
    23         else if (S_ISDIR(buf.st_mode))
    24             ptr = "directory";
    25         else if (S_ISCHR(buf.st_mode))
    26             ptr = "character special";
    27         else if (S_ISBLK(buf.st_mode))
    28             ptr = "block special";
    29         else if (S_ISFIFO(buf.st_mode))
    30             ptr = "fifo";
    31         else if (S_ISLNK(buf.st_mode))
    32             ptr = "symbolic link";
    33         else if (S_ISSOCK(buf.st_mode))
    34             ptr = "socket";
    35         else
    36             ptr = "** unknown mode **";
    37         printf("%s
    ", ptr);
    38     }
    39     exit(0);
    40 }

    运行测试

      创建一个测试文件,并用该程序判断其文件类型。

      

    小结

      1. 当判定链接类型文件时,如果需要判定的对象是链接文件所链接的那个文件而非此链接文件本身的话,则应当使用 stat 函数

      2. 当希望通过文件描述符指定文件时,则应当使用 fstat 函数

  • 相关阅读:
    dapper中使用类似whereif语句
    xamarin开发常见错误总结Sqlite本地数据库使用了保留字段导致语法错误
    vs2019C#代码规范设置命名规范
    xamarin在visual studio中遇到的包还原问题
    基础知识除数vs被除数
    xaf代码注册module
    xaf手动注册module之WebForm
    xamarin开发常见错误总结the operation was canceled
    JDK源码分析实战系列ThreadLocal
    公众号文章汇总
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3652990.html
Copyright © 2020-2023  润新知