C程序中如何读取目录中的文件并判断文件大小等信息 - leon11241124

leon1124 2021-08-27 原文


C程序中如何读取目录中的文件并判断文件大小等信息


读取目录内容

应用程序可以用readdir系列函数来读取目录内容。

#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *name);		//成功返回目录指针,失败返回NULL
struct dirent *readdir(DIR *dirp);	//成功返回目录项指针,已读完或失败返回NULL
int closedir(DIR *dirp);			//成功返回0,错误返回-1.

每次对readdir的调用返回的都是指向下一个目录项的指针,如果没有更多的目录项则返回NULL。每个目录项都是一个结构,形式如下:

struct dirent{
    ino_t d_ino;		//inode值
    char d_name[256];	//文件名
}

如果出错,readdir也是返回NULL,但是它同时会设置errno。所以这时唯一区分错误还是流结束的线索,我们需要在程序中检查errno在readdir调用前后是否变化来检查有没有错误。

int main(int argc, char **argv)
{
	DIR *streamp;
    struct dirent *dep;
    
   if(!(streamp = opendir(argv[1]))) 
       exit(-1);
    
    errno = 0;    
    while((dep = readdir(streamp)) != NULL){
        printf("Found file:%s\n", dep->d_name);
    }
    
    if(errno != 0)
        exit(-2);
        
    if(closedir(streamp))
        exit(-3);
    
    exit(0);
}

读取文件元数据

应用程序能够调用stat及fstat函数,检索到文件信息(或称为文件元数据)。

#include <unistd.h>
#include <sys/stat.h>

int stat(const char *filename, struct stat *buf);
int fstat(int fd, struct stat *buf);
											//成功返回0,出错返回-1

下图列出结构体stat的详细成员:

struct stat {
    dev_t	st_dev;		//设备
    ino_t	st_ino;		//	inode
    mode_t	st_mode;	//文件权限信息
    nlink_t	st_nlink;	//硬连接数
    uid_t	st_uid;		//用户ID
    gid_t	st_gid;		//组ID
    dev_t	st_rdev;	//设备类型(如果是节点设备的话)
    off_t	st_size;	//文件大小(字节)
    unsignedlong st_blksize;	//块大小
    unsignedlong st_blocks;		//块数目
    time_t 	st_atime;	//文件最后访问时间
    time_t 	st_mtime;	//文件最后修改时间
    time_t 	st_ctime;	//文件最后变动时间
};

linux系统在stat.h中定义了宏谓词来确定st_mode成员的文件类型:

  • S_ISREG(m) :这是一个普通文件吗?
  • S_ISDIR(m) :这是一个目录文件吗?
  • S_ISSOCK(m) :这是一个网络套接字吗?

下面一个查询和处理一个文件st_mode位的示例:

int main (int argc, char **argv) 
{
    struct stat stat;
    char *type, *readok;

   
    if (argc != 2) {
	fprintf(stderr, "usage: %s <filename>\n", argv[0]);
	exit(0);
    }
    
    Stat(argv[1], &stat);
    if (S_ISREG(stat.st_mode))     /* Determine file type */
	type = "regular";
    else if (S_ISDIR(stat.st_mode))
	type = "directory";
    else 
	type = "other";
    if ((stat.st_mode & S_IRUSR)) /* Check read access */
	readok = "yes";
    else
	readok = "no";

    printf("type: %s, read: %s\n", type, readok);
    exit(0);
}

获取更多知识,请点击关注:
嵌入式Linux&ARM
CSDN博客
简书博客


发表于
2020-03-24 17:37 
leon11241124 
阅读(74
评论(0
编辑 
收藏 
举报

 

版权声明:本文为leon1124原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/leon1124/p/14039683.html

C程序中如何读取目录中的文件并判断文件大小等信息 - leon11241124的更多相关文章

  1. linux系统无法正常启动,故障排查恢复 – zangfans

    linux系统无法正常启动,故障排查恢复 linux内核启动修复 首先看一下linux内核重要文件grub.c […]...

  2. H5和安卓原生进行交互的操作流程记录 – 人鱼之森

    H5和安卓原生进行交互的操作流程记录 本人只是一个前端,第一次接触和移动端的混合开发,遇到了一些问题,现在记录 […]...

  3. usb2.0、usb3.0、usb3.1、type-c 接口含义与区别 – 阿智

    usb2.0、usb3.0、usb3.1、type-c 接口含义与区别 简单说: usb3.0 比2.0的传输 […]...

  4. 在 Windows 7 下使用 Android NDK r5c 编译 FFmpeg 0.7.1 – Scott Wong

    在 Windows 7 下使用 Android NDK r5c 编译 FFmpeg 0.7.1 2011-06 […]...

  5. AVR单片机教程——定时器中断 – jerry_fuyi

    AVR单片机教程——定时器中断 本文隶属于AVR单片机教程系列。   中断,是单片机的精华。 中断基础 当一个 […]...

  6. 壹度DIY_微信小程序组件_小程序插件开发 – 壹度技术

    壹度DIY_微信小程序组件_小程序插件开发 开源免费插件,diy特有的页面机制,搭配30+自定义组件,让你的站 […]...

  7. 阿里云主机购买和使用 – 反射弧

    阿里云主机购买和使用 如何购买云主机,连接云主机,更改主机操作系统,安装服务程序 一、购买 在阿里云官网搜索  […]...

  8. 短视频SDK 视频编辑SDK AE模版SDK 人体抠图SDK 绿幕抠图SDK – toby0405

    短视频SDK 视频编辑SDK AE模版SDK 人体抠图SDK 绿幕抠图SDK   优势:  快速接入免费试用名 […]...

随机推荐

  1. 为什么Mysql的常用引擎都默认使用B+树作为索引?

    一、前言 为了讲清楚这个问题,我们要先了解什么是索引。 我记得刚刚学习数据库的时候,老师喜欢用书本的目录来类比 […]...

  2. JavaEE项目实战视频教程

    基于JavaEE平台实战WebService框架Xfire+Ajax框架DWR(租房网项目实战)课程分类:Ja […]...

  3. UUID字符串使用

    UUID字符串使用 Posted on 2020-07-23 16:11  张雪冬前端学习园地  阅读( […]...

  4. Java学习从入门到精通(学习过程) – Jacky_Xu

    Java学习从入门到精通(学习过程) 2007-10-11 13:14  Jacky_Xu  阅读(417)  […]...

  5. 以太坊节点发现协议

    本档前部分翻译自以太坊定义的节点发现协议(版本4),后半部分给出了源码实现的大致流程,以帮助理解。 以太坊节点 […]...

  6. html页面中嵌入html页面

    1、Iframe: <iframe src=”top1.html” frameB […]...

  7. @staticmethod装饰器–python静态方法

    在python中, 通过obj.method()调用一个方法默认会传入实例本身作为参数. 在类中定义方法时, […]...

  8. 硬盘种类和特点

    ●IDE 电子集成驱动器 (Integrated Drive Electronics) 它的本意是指把“硬盘控 […]...

展开目录

目录导航