最近项目中需要目录遍历,把遍历到的文件/文件夹保存到数据结构中,其他模块根据索引找对对应的文件名和路径。可变长数组相比链表的好处是省去了查找环节,提高效率。
#define PATH_LEN 256
#define NAME_LEN 128
#define STEP_LEN 1024//每次增加1024个指针数组
typedef struct
{
char file_path[PATH_LEN];
char file_name[NAME_LEN];
}FileInfo;
typedef struct
{
FileInfo **file_info;
unsigned int file_num;
unsigned int file_max_num;
}FileNode;
static int file_node_new(FileNode *node)
{
node->file_info = (FileInfo **)malloc(sizeof(FileInfo *)*STEP_LEN);
node->file_num = 0;
node->file_max_num = STEP_LEN;
return 0;
}
static int file_node_add(FileNode *node, char *name, char *path)
{
FileInfo **tmp = NULL;
FileInfo *tmp2 = NULL;
unsigned int num = 0;
if(node->file_num >= node->file_max_num)
{
tmp = (FileInfo **)malloc(sizeof(FileInfo *)*(STEP_LEN + node->file_max_num));
memcpy(tmp, (node->file_info),sizeof(FileInfo *)*(node->file_num));
free(node->file_info);node->file_info=NULL;
node->file_info = tmp;
node->file_max_num = node->file_max_num + STEP_LEN;
}
tmp2 = (FileInfo *)malloc(sizeof(FileInfo));
if(NULL == tmp2){return -1;}
strcpy(tmp2->file_name,name);
strcpy(tmp2->file_path,path);
num = node->file_num;
(node->file_info)[num] = tmp2;
node->file_num++;
return 0;
}
static int file_node_delete(FileNode *node)
{
int i = 0;
for(i=0; i<node->file_num; i++)
{
if(NULL != (node->file_info)[i])
{
free((node->file_info)[i]);
(node->file_info)[i] = NULL;
}
}
free(node->file_info);node->file_info = NULL;
return 0;
}