使用readdir读取目录文件并按时间排序输出

使用readdir读取目录文件并按时间排序输出

最近需要使用readdir遍历目录下文件,但是发现取出文件的顺序都是随机的,百度发现可以使用scandir函数按照规则排序:

https://blog.csdn.net/krens/article/details/78365382?utm_source=blogxgwz3

刚学C语言,所以决定自己动手写一下,写这个也是给自己做笔记,其中使用了readdir和stat函数,关于这两个函数的讲解:

https://www.cnblogs.com/jikexianfeng/p/5742887.html
https://www.cnblogs.com/gangzilife/p/9083470.html

下面贴一下实现代码:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h> 
#include<unistd.h> 
#include<stdlib.h>
#include<string.h>

#define MAX_NAME_LEN 256+1

typedef struct  file_list
{ 
	time_t   file_ctime;
	char*     file_name;
	struct file_list* next;
}file_list_t;
	

void main(int argc, char** argv)
{ 
	DIR*   			 dir;
	struct dirent*   ptr;
	int 			 i;
	int              flag = 0;
	struct stat      file_stat;
	char*            dir_path;
	
	file_list_t*  file_list_head = NULL;
	file_list_t*  file_list_tail = NULL;
	file_list_t*  file_list_atmp = NULL;
	file_list_t*  file_list_btmp = NULL;
	file_list_t*  file_list_node = NULL;
	
	dir_path = (char*)malloc(MAX_NAME_LEN);
	memset(dir_path, 0, MAX_NAME_LEN);
	strcpy(dir_path, argv[1]);
	dir = opendir(dir_path);

	while((ptr = readdir(dir)) != NULL)
	{ 
		memset(dir_path, 0, MAX_NAME_LEN);
		strcpy(dir_path, argv[1]);
		strcat(dir_path, "/");
		strcat(dir_path, ptr->d_name);
		stat(dir_path, &file_stat);
		if(S_ISREG(file_stat.st_mode))
		{ 
			file_list_node = (file_list_t*)malloc(sizeof(file_list_t));		
			file_list_node->file_name = (char*)malloc(MAX_NAME_LEN);
			memset(file_list_node->file_name, 0, MAX_NAME_LEN);

			file_list_node->file_ctime = file_stat.st_ctime;
			strcpy(file_list_node->file_name, ptr->d_name);

			if(file_list_head == NULL)
			{ 
				file_list_head = file_list_node;
				file_list_tail = file_list_node;
			}
			else
			{ 
				flag = 0;
				file_list_atmp = file_list_head;
				file_list_btmp = NULL;
				while(file_list_atmp != NULL)
				{ 
					if(file_list_node->file_ctime < file_list_atmp->file_ctime)
					{ 
						flag = 1;
						if(file_list_btmp == NULL)
						{ 
							file_list_btmp = file_list_head;
							file_list_head = file_list_node;
							file_list_head->next = file_list_btmp;
						}
						else
						{ 
							file_list_btmp->next = file_list_node;
							file_list_node->next = file_list_atmp;
						}
						break;
					}
					file_list_btmp = file_list_atmp;
					file_list_atmp = file_list_atmp->next;
				}
				if (flag == 0)
				{ 
				file_list_tail->next = file_list_node;
				file_list_tail = file_list_node;
				}
			}
		}
	}
	closedir(dir);
	
	file_list_atmp = file_list_head;
	while(file_list_atmp != NULL)
	{ 
		printf("c_time:%ld file_name:%-s \n", file_list_atmp->file_ctime, file_list_atmp->file_name);
		file_list_btmp = file_list_atmp;
		file_list_atmp = file_list_atmp->next;
		free(file_list_btmp->file_name);
		free(file_list_btmp);
	}
	free(dir_path);
}

坚持学习

    原文作者:bibibibibii
    原文地址: https://blog.csdn.net/bibibibibii/article/details/103601313
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞