使用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);
}
坚持学习