而我强无敌啊。用的是循环双向链表存放的数据。先上结构体:
/* 用于存放文件信息 */typedef struct FILE_STRU{ unsigned char *name; /* 文件名字 */ struct FILE_STRU *PRev, *next; /* 前后的文件 */}file_stru;/* 用于存放文件夹信息 */typedef struct DIR_STRU{ unsigned char *name; /* 文件夹名字 */ struct DIR_STRU *node_dir_head; /* 文件夹下文件夹的地址 */ struct FILE_STRU *file_head; /* 文件夹下首文件的地址 */ struct DIR_STRU *prev, *next; /* 相同路径前后的文件夹 */}dir_stru;然后在使用过程中,发现读取的时候只输出一部分。是存放时候的问题呢,还是读取时候的问题呢?直奔答案了啊,都不是强无敌的思路有问题啊,是内存知识还没有掌握,这下好了,有了突破,就是存放的时候和读取的时候出问题了。。感觉自己66的。上代码:
static dir_stru *_pdir = NULL;/* 查找文件夹下的文件 */struct FILE_STRU *search_file(char *name){ DIR *pdir = (DIR *)source_dir_opened(name); if(pdir == NULL) return NULL; /* 获取该文件夹文件名 */ char *dir, *dirname; dir = strdup(name); while(dir != NULL) dirname = strsep(&dir, "/"); file_stru *pfile_a = (file_stru *)file_list_init(); ((dir_stru *)find_dir_node_by_name(_pdir, dirname))->file_head = pfile_a; struct dirent *dir_file; char *path_tmp; /* 开始插入对应子文件 */ while(dir_file = readdir(pdir)) { if(dir_file->d_type == DT_REG) file_list_insert((file_stru *)pfile_a, file_list_get_node(dir_file->d_name)); if(dir_file->d_type == DT_DIR) { if(!strcmp(dir_file->d_name, ".") || !strcmp(dir_file->d_name, "..")) continue; path_tmp = (char *)get_file_filepath(name, dir_file->d_name); search_file(path_tmp); free(path_tmp); } } closedir(pdir); return pfile_a;}看到红色标识没。。。尴尬。。。文件夹一关闭,对应的dirent内存空间也是会释放的!!我定义存放名字的是指针呢!内存都被释放了,指到哪了都。。。然后问题就解决了。直接上正确代码:file_list_insert((file_stru *)pfile_a, file_list_get_node(strdup(dir_file->d_name)));closedir(pdir);文件夹资源释放前把文件名字struct dirent *p->d_name内存弄没了。。好了。大概就是这么蠢的问题我花了好几个小时才找出来。涨知识了。
新闻热点
疑难解答