首页 > 学院 > 开发设计 > 正文

为何将文件名字读取到内存用链表存放,再从内存中读取信息输出到屏幕只显示一部分?

2019-11-06 06:48:30
字体:
来源:转载
供稿:网友
这次做的小项目是拷贝文件夹下所有文件到目标路径,并在读取源路径的同时将文件夹下所有文件的名字存放到链表中。

而我强无敌啊。用的是循环双向链表存放的数据。先上结构体:

/*			用于存放文件信息			*/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;

然后在使用过程中,发现读取的时候只输出一部分。是存放时候的问题呢,还是读取时候的问题呢?为何将文件名字读取到内存用链表存放,再从内存中读取信息输出到屏幕只显示一部分? - 闪闪闪 - SimKimyiw‘s blog直奔答案了啊,都不是强无敌的思路有问题啊,是内存知识还没有掌握,这下好了,有了突破,就是存放的时候和读取的时候出问题了。。感觉自己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内存弄没了。。好了。大概就是这么蠢的问题我花了好几个小时才找出来。涨知识了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表