第九篇:使用lstat函数获取文件信息

穆晨 穆晨     2022-08-21     603

关键词:

前言

       在之前的文章中,描述过如何用 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\n", ptr);
38     }
39     exit(0);
40 }

运行测试

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

       

小结

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

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

stat(),lstat(),fstat()获取文件/目录的相关信息

  stat的使用Linux有个命令,ls-l,效果如下: 这个命令能显示文件的类型、操作权限、硬链接数量、属主、所属组、大小、修改时间、文件名。它是怎么获得这些信息的呢,请看下面的讲解。stat的基本使用stat:返回一... 查看详情

stat/lstat函数使用(代码片段)

1.进程虚拟地址空间2.stat函数获取文件信息#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>intstat(constchar*pathname,structstat*statbuf);intfstat(intfd,structstat*statbuf);intlstat(constcha 查看详情

第九篇:top命令free命令

top命令(查看进程的状态)1.cacheandbuffer2.cache:存放cpu经常调用的数据3.buffer:积攒硬盘上零散数据 free命令(使用内存的使用状态)1.free-m以M为单位 free-h以G为单位2.信息解读,如图:(1):已经分配给cache和buffer的内存=3+4+5(... 查看详情

第九篇swift的基本使用

1.访问权限/*1>internal:内部的1.默认情况下所有的类&属性&方法的访问权限都是internal2.在本模块(项目/包/target)中可以访问2>private:私有的1.只有在本类中可以访问3>open:公开的1.可以跨模块(项目/包/target)都是可以访问4>f... 查看详情

第九篇装饰器

阅读目录一什么是装饰器二装饰器需要遵循的原则三实现装饰器知识储备四高阶函数五函数嵌套六闭包七无参装饰器八装饰器应用示例 一什么是装饰器器即函数装饰即修饰,意指为其他函数添加新功能装饰器定义:本质就是... 查看详情

第九篇装饰器

阅读目录一什么是装饰器二装饰器需要遵循的原则三实现装饰器知识储备四高阶函数五函数嵌套六闭包七无参装饰器八装饰器应用示例九超时装饰器 一什么是装饰器器即函数装饰即修饰,意指为其他函数添加新功能装饰器定... 查看详情

第九篇数据表设计和保存item到json文件

上节说到Pipeline会拦截item,根据设置的优先级,item会依次经过这些Pipeline,所以可以通过Pipeline来保存文件到json、数据库等等。下面是自定义json#存储item到json文件classJsonWithEncodingPipeline(object):def__init__(self):#使用codecs模块来打开... 查看详情

实践课-------(第九篇)

通过这十天的框架搭建学习,学会了环境配置,及其测试,得出以下总结1.创建WEB工程添加struts支持2.分包3添加spring支持4.添加spring配置文件5.在web.xml文件中配置初始化读取参数(spring的配置文件)6.配置spring监听... 查看详情

用仿actionscript的语法来编写html5——第九篇,仿urlloader读取文件

第九篇,仿URLLoader读取文件先看看最后的代码functionreadFile(){urlloader=newLURLLoader();urlloader.addEventListener(LEvent.COMPLETE,readFileOk);urlloader.load("../file/test.txt","text");}functionreadFileOk(){mytxt.text 查看详情

数据结构第九篇——栈与递归

栈还有一个重要应用是在程序设计中实现递归。递归是计算机科学和数学中一种解决问题的及其重要的方法。在数据结构中,可以用它来设计简单。易于理解的算法,特别是在一些具有递归定义的结构上设计算法。递归的概念一... 查看详情

第九篇:进程与线程

一、paramiko模块二、ssh登录过程和上传下载三、进程和线程简绍四、多线程、多线程实例五、守护线程六、线程锁七、递归锁八、信号量九、线程间通信event十、queue消息队列十一、进程Queue数据传递十二、pipe管道通信十三、进程... 查看详情

第九篇:网络编程补充与进程

本篇内容udp协议套接字开启进程的方式多进程实现并发的套接字通信join方法守护进程同步锁进程队列生产者消费者模型进程池paramiko模块 一、 udp协议套接字1.TCP和UDP在传输层区别:UDP是无连接不可靠的数据报协议。TCP提... 查看详情

python学习第九篇:zipfile库操作压缩包(代码片段)

​Python学习第九篇:zipfile库操作压缩包——活动地址:CSDN21天学习挑战赛zipfile是python里用来做zip格式编码的压缩和解压缩的zipfile里有两个非常常用的class,分别是ZipFile和ZipInfo,在绝大多数的情况下,我们只需要使用这... 查看详情

python学习第九篇:zipfile库操作压缩包(代码片段)

​Python学习第九篇:zipfile库操作压缩包——活动地址:CSDN21天学习挑战赛zipfile是python里用来做zip格式编码的压缩和解压缩的zipfile里有两个非常常用的class,分别是ZipFile和ZipInfo,在绝大多数的情况下,我们只需要使用这... 查看详情

第九篇测试

sublime使用技巧1:安装漂亮的编程字体http://pan.baidu.com/s/1xMex9下载"程序编写字体–YaheiConsolasHybrid",双击安装2:解压sublime到你的程序目录,如D:/programefiles/3:ctrl+b打开浏览器,如果你已经安装apache,nginx等,并假设你的www目录为D:\www\编辑subl... 查看详情

第九篇:使用adaboost元算法提高分类器性能

前言      有人认为AdaBoost是最好的监督学习的方式。      某种程度上因为它是元算法,也就是说它会是几种分类器的组合。这就好比对于一个问题能够咨询多个"专家"的意见了。 &n... 查看详情

springcloud-第九篇feign

1:Feign是什么Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,只需要创建一个接口,然后在上面添加注解即可。官网:https://github.com/OpenFeign/feign2:Feign能干什么Feign旨在使编写JavaHttp客户端变得更容易... 查看详情

windows编程系列第九篇:剪贴板使用

??上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它经常使用于复制粘贴功能。剪贴板是Windows最早就增加的功能,因为该功能很有用,我们差点儿每天都会使用到。通过剪贴板,我们就能够将数据从一个应用程... 查看详情