linux的readdir和readdir_r函数

1.首先要打开目录文件

DIR *opendir( const char *name);

DIR *fdopendir( int fd);

2.读取目录文件信息的函数

注意:这是个库函数

struct dirent *readdir( DIR *dirp);

int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result);

文件目录结构体:
    struct dirent {
          ino_t          d_ino;       /* inode number 索引节点号*/
          off_t          d_off;       /* not an offset; see NOTES 在目录文件中的偏移*/
          unsigned short d_reclen;    /* length of this record 文件名长*/
          unsigned char  d_type;   /*type of file; not supported by all  filesystem types 文件类型*/              
                                                                                               
          char           d_name[256]; /* filename 文件名,最长255字符*/
               };
d_type的值为:

DT_BLK This is a block device.

DT_CHR This is a character device.

DT_DIR This is a directory.

DT_FIFO This is a named pipe (FIFO).

DT_LNK This is a symbolic link.

DT_REG This is a regular file.

DT_SOCK This is a UNIX domain socket.

DT_UNKNOWN The file type is unknown.

readdir()函数实例:

注意:

每次使用readdir后,readdir会读到下一个文件,readdir是依次读出目录中的所有文件,每次只能读一个

这个特性和readdir_r()一样

    #include <stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
    int main(int argc, char **argv)
     
    {
    	DIR *pDir = NULL;
    	struct dirent * pEnt = NULL;
    	unsigned int cnt = 0;	
    	if (argc != 2)
    	{
    		printf("usage: %s dirname\n", argv[0]);
    		return -1;
    	}
    	pDir = opendir(argv[1]);
    	if (NULL == pDir)
    	{
    		perror("opendir");
    		return -1;
     
    	}	
    	while (1)
    	{
    		pEnt = readdir(pDir);
    		if(pEnt != NULL)
    		{
    			if (pEnt->d_type == DT_REG)
    			{
    				printf("是普通文件:");
    			}
    			else
    			{
    				printf("不是普通文件:");
    			}
    			printf("name:[%s]	\n", pEnt->d_name);
    			cnt++;
    		}
    		else
    		{
    			break;
    		}
    	};
    	printf("总文件数为:%d\n", cnt);
    	return 0;
    }

结果:

    $ ./a.out .
    是普通文件:name:[a.c]	
    不是普通文件:name:[.]	
    不是普通文件:name:[..]	
    是普通文件:name:[a.out]	
    不是普通文件:name:[12_sr]	
    不是普通文件:name:[10_sr]	
    不是普通文件:name:[17_sr]	
    不是普通文件:name:[15_sr]	
    不是普通文件:name:[14.sr]	
    不是普通文件:name:[18_sr]	
    不是普通文件:name:[udp]	
    不是普通文件:name:[16_sr]	
    不是普通文件:name:[tcp]	
    总文件数为:13

readdir_r():

注意:

这三个参数

    #include <stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <stdlib.h>
    int main(int argc, char **argv)
    {
    	DIR *pDir = NULL;
    	struct dirent * pEnt = NULL;
        	struct dirent *entry = (struct dirent *)malloc(sizeof(struct dirent));
        	struct dirent **result = (struct dirent **)malloc(sizeof(struct dirent));
    	unsigned int cnt = 0;
    	unsigned int ret = 0;	
    	if (argc != 2)
    	{
    		printf("usage: %s dirname\n", argv[0]);
    		return -1;
    	}
    	pDir = opendir(argv[1]);
    	if (NULL == pDir)
    	{
    		perror("opendir");
    		return -1;
    	}
    	ret = readdir_r(pDir , entry , result);
    	printf("return	:%d	\n", ret);
    	printf("name	:[%s]	\n", entry->d_name);
    	printf("name	:[%s]	\n", result[0]->d_name);
    	ret = readdir_r(pDir , entry , result);
    	printf("return	:%d	\n", ret);
    	printf("name	:[%s]	\n", entry->d_name);
    	printf("name	:[%s]	\n", result[0]->d_name);
    	return 0;
     
    }

结果:
在这里插入图片描述

版权声明:本文为CSDN博主「QtHalcon」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40732350/article/details/81986548

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值