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

3/8/2017来源:ASP.NET技巧人气:1883

这次做的小项目是拷贝文件夹下所有文件到目标路径,并在读取源路径的同时将文件夹下所有文件的名字存放到链表中。

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

/*			用于存放文件信息			*/
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内存弄没了。。

好了。大概就是这么蠢的问题我花了好几个小时才找出来。涨知识了。