01 32位Linux环境获取文件夹下的所有文件名

本文介绍了如何在32位和64位Linux系统中使用C语言获取文件夹下的所有文件名。通过示例代码展示了使用dirent.h头文件和opendir、readdir、closedir函数遍历目录的过程。同时,代码还提供了在命令行中指定目录的选项。此外,文章还探讨了文件名长度限制和在不同平台下dirent结构体的差异。
摘要由CSDN通过智能技术生成
  • 32位和64位Linux环境获取文件夹下的所有文件名。
  • 执行结果:
jim@DESKTOP-SVP3BEM MINGW64 /d/1_git/embedded_programming_skills/1_src/09-get_all_file_names_from_dir (develop)
$ ./demo.exe
 ========
| main函数的参数1默认是本程序的路径和名称
| argv[0]: D:\1_git\embedded_programming_skills\1_src\09-get_all_file_names_from_dir\demo.exe
| 可以使用./demo your_path 的方式执行你自己指定的目录
 ========

父目录名:D:\1_git\embedded_programming_skills\1_src\09-get_all_file_names_from_dir\
子文件及子文件夹:
name: .
name: ..
name: demo.exe
name: get_filenames.c
name: Makefile
name: 从文件夹获取所有文件名,并按指定格式存储.txt

  • Gitee源码及工程地址:https://gitee.com/langcai1943/embedded_programming_skills/tree/develop/1_src/09-get_all_file_names_from_dir

  • C语言源码如下:

/*******************************************************************************
 * /brief	从指定路径中读取并打印所有文件名
 * /details	提示:如果只是将文件夹中所有文件名打印出来,并没有太大实用意义;可以将
 *			读取的所有文件名按一定格式如XML格式存储起来,这样方便需要时通过指定
 *			键值查找和使用文件名;也可以将一批文件用1.txt、2.txt、3.txt等自然数
 *			顺序存储起来,使用时用snprintf直接来遍历文件名打开。
 * /warning	读文件夹调用的不是C语言标准库文件,Linux和Windows下使用的头文件和
 *			函数都不一样,本用例使用Linux的dirent.h头文件。
 * /author	将狼才鲸
 * /date	2022-10-23
 * /note	file format: UTF-8,使用UTF-8可以防止用git提交代码查看文件差异时出现
 *			乱码;防止在Windows环境和Linux下来回编译后中文乱码无法恢复。
 * /note	本文件使用tab缩进,文本宽度80字符,使用等宽字体,中文占两个字符宽度。
 * /note	参考资料:[【获取指定目录下的所有文件名】]
 *			(https://blog.csdn.net/hello_dear_you/article/details/121789764)
 * /note	Linux规定单个文件或单个目录名应该小于255个字符,对目录深度的限制不明
 * /note	Windows下MinGW下的头文件路径:
 *			D:\ProgramFiles\msys64\mingw32\i686-w64-mingw32\include\dirent.h
 *			D:\ProgramFiles\msys64\mingw64\x86_64-w64-mingw32\include\dirent.h
 *			D:\ProgramFiles\msys64\usr\include\sys\dirent.h
 ******************************************************************************/

/********************************** 头文件 ************************************/
#include <stdio.h>	/* printf */
#include <dirent.h>	/* opendir readdir closedir */

/********************************** 宏定义 ************************************/
#define LOOP_BUFFER_UNITEST /* 定义可以直接编译测试此文件 */
#define DEFAULT_DIR_PATH "D:\\1_git\\embedded_programming_skills\\1_src\\09-get_all_file_names_from_dir\\"
#define FILENAME_LENGTH_MAX 256 /* Linux规定单个文件或单个目录名应该小于255个字符 */
#define pr_debug	printf
#define pr_info		printf
#define pr_err		printf
#define EOK			(0)
#define ECOMMON		(-1)

/********************************* 接口函数 ***********************************/
#ifdef LOOP_BUFFER_UNITEST
/**
 * /brief	程序入口
 */
int main(int argc, char *argv[])
{
	DIR *fd_dir;		/* 目录句柄 */
	/* [dirent结构体中d_type](https://blog.csdn.net/fqx111/article/details/8983547) */
	struct dirent *ptr;	/* 读取的文件名或子文件夹信息 */
	char *user_path = NULL;

	pr_info(" ========\n");
	pr_info("| main函数的参数1默认是本程序的路径和名称\n");
	pr_info("| argv[0]: %s\n", argv[0]);
	pr_info("| 可以使用./demo your_path 的方式执行你自己指定的目录\n");
	pr_info(" ========\n\n");

	/* 1. 指定要操作的目录名 */
	if (argc > 1) {
		/* 如果有两个参数传入,则默认第二个参数是目录名,第一个参数固定是本程序的路径和名称 */
		pr_debug("user path name: %s\n", argv[1]);
		user_path = argv[1];
	}

	/* 2. 打开目录 */
	if (!user_path)
		user_path = DEFAULT_DIR_PATH;

	fd_dir = opendir(user_path);
	if (!fd_dir) {
		pr_err("ERR: 打开目录%s失败!\n", user_path);
		return 0;
	}
	pr_info("父目录名:%s\n子文件及子文件夹:\n", user_path);

	/* 3. 遍历文件夹 */
	ptr = (struct dirent *)(-1);
	while (ptr) {
		ptr = readdir(fd_dir);
		if (ptr) {
			pr_info("name: %s\n", ptr->d_name);
			
			if (!strcmp(ptr->d_name, ".") && !strcmp(ptr->d_name, "..")) {
				/* .是本目录,..是父目录,Linux每个文件夹中都有的两个子目录链接 */
				/**
				 * TODO: 判断名称是文件夹还是文件;将名称加入到自己的键值对、队列或者链表中,
				 * 		 等待进一步使用
				 */

				/**
				 * [64位dirent结构体中d_type](https://blog.csdn.net/fqx111/article/details/8983547)
				 * DT_UNKNOWN = 0,
				 * DT_FIFO = 1,
				 * DT_CHR = 2,
				 * DT_DIR = 4,
				 * DT_BLK = 6,
				 * DT_REG = 8,
				 * DT_LNK = 10,
				 * DT_SOCK = 12,
				 * DT_WHT = 14
				 */
				/* 64位判断是文件还是文件夹 */
				//pr_info("%d ", ptr->d_type); // 32位dirent没有d_type成员

				/**
				 * [32位linux c 判断路径是 目录还是文件](https://blog.csdn.net/whatday/article/details/103362612)
				 * 函数 stat()用于获取一个文件路径的信息,并把获取到的信息放到结构体 struct stat 中
				 * 宏 S_ISDIR()用于判断一个文件路径是不是一个目录,是则返回1,否则返回0
				 * 宏 S_ISREG()用于判断一个文件路径是不是一个普通文件,是则返回1,否则返回0
				 */
			}
		}
	}

	closedir(fd_dir);

	return 0;
}
#endif /* LOOP_BUFFER_UNITEST */

  • Makefile如下:
default:
	gcc -o demo get_filenames.c
clean:
	rm demo.exe
#	rm demo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值