这次做的小项目是拷贝文件夹下所有文件到目标路径,并在读取源路径的同时将文件夹下所有文件的名字存放到链表中。
而我强无敌啊。用的是循环双向链表存放的数据。先上结构体:
/* 用于存放文件信息 */
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内存弄没了。。
好了。大概就是这么蠢的问题我花了好几个小时才找出来。涨知识了。