C++ - 深度搜索遍历文件夹

深度搜索遍历文件夹

 

深度优先搜索遍历文件夹所有文件, 由于使用windows的函数, 必须要使用C语言;

注意字符集的问题,使用"#undef UNICODE", 屏蔽因字符集所产生的问题;

使用vector<string>存储所有文件名, 因为要递归使用, 所以需要设置为静态,返回shared_ptr的指针

代码如下:

/*************************************************
File: main.cpp
Copyright: C.L.Wang
Author: Caroline
Date: 2013-11-27
Description: 深度优先递归遍历目录中所有的文件
Email: morndragon@126.com
**************************************************/

#undef UNICODE

#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <cstring>

#include <windows.h>

std::shared_ptr<std::vector<std::string> >
fileList(const std::string& folder_path)
{
	static std::shared_ptr<std::vector<std::string> > 
		folder_files(new std::vector<std::string>); //返回指针, 需要迭代使用

	WIN32_FIND_DATA FindData;
	HANDLE hError;

	int file_count(0);
	std::string file_path(folder_path); //路径名
	std::string full_file_path; //全路径名 

	file_path.append("/*.*");
	hError = FindFirstFile(file_path.c_str(), &FindData);
	if (hError == INVALID_HANDLE_VALUE) {
		std::cout << "failed to search files." << std::endl;
		return nullptr;
	}
	while(FindNextFile(hError, &FindData))
	{
		//过虑".", "..", "-q"
		if(0 == strcmp(FindData.cFileName, ".") || 
			0 == strcmp(FindData.cFileName, "..") || 
			0 == strcmp(FindData.cFileName, "-q"))
		{
			continue;
		}

		//完整路径
		full_file_path.append(folder_path);
		full_file_path.append("/");
		full_file_path.append(FindData.cFileName);
		++file_count;

		if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
			//std::cout << file_count << " " << full_file_path << "<Dir>" << std::endl;
			fileList(full_file_path);
		}else{
			folder_files->push_back(full_file_path);
			//std::cout << file_count << " " << full_file_path << std::endl;
		}
		full_file_path.clear(); //清空目录
	}
	return folder_files;
}

int main(void) 
{
	std::shared_ptr<std::vector<std::string> > folder_files;
	folder_files = fileList("E:/Picture/shoes3");
	if (folder_files) {
		for (size_t i=0; i != folder_files->size(); ++i) {
			std::cout << i+1 << " : " << (*folder_files)[i] << std::endl;
		}
	}
	return 0;
}


 

### 回答1: c语言遍历文件夹的方法如下: 1. 使用opendir函数打开文件夹, 并使用readdir函数读取文件夹中的文件名。 2. 使用循环遍历文件夹中的所有文件。 3. 对于每一个文件, 使用stat函数获取文件的信息, 包括文件类型(是否是文件夹)。 4. 如果是文件夹, 递归调用此函数, 进入新的文件夹继续遍历。 5. 当文件夹遍历完毕后, 使用closedir函数关闭文件夹。 下面是一个示例代码: ``` #include <stdio.h> #include <dirent.h> #include <sys/stat.h> void listdir(const char *name) { DIR *dir; struct dirent *entry; if (!(dir = opendir(name))) return; while ((entry = readdir(dir)) != NULL) { struct stat st; char path[1024]; snprintf(path, sizeof(path), "%s/%s", name, entry->d_name); if (lstat(path, &st) == -1) continue; if (S_ISDIR(st.st_mode)) { if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; printf("%*s[%s]\n", indent, "", entry->d_name); listdir(path); } else printf("%*s- %s\n", indent, "", entry->d_name); } closedir(dir); } int main() { listdir("."); return 0; } ``` 希望这个示例代码能够帮助你理解文件夹遍历的方法。 ### 回答2: 遍历文件夹指的是以某种方式遍历文件夹中的所有文件文件夹。在计算机编程中,常用的遍历文件夹的方法包括递归和迭代。 递归遍历文件夹是一种深度优先的方式。这种方法会从根文件夹开始,首先获取当前文件夹中的所有文件文件夹。然后,对于每个文件夹,再递归调用遍历文件夹方法,重复上述步骤,直到遍历到最底层的文件夹。这种方式可以确保遍历文件夹中的每个文件文件夹,但可能会消耗较多的内存。 迭代遍历文件夹是一种广度优先的方式。这种方法会使用一个队列来存储待遍历文件夹。开始时,将根文件夹入队。然后,从队列中取出一个文件夹,获取其中的所有文件文件夹,并将它们入队。重复上述步骤,直到队列为空。这种方式可以逐层遍历文件夹,较递归方式占用较少的内存。 在实际编程中,可以根据具体需求选择适合的遍历文件夹的方法。递归方式相对简单,但可能导致栈溢出或死循环等问题。迭代方式相对复杂,但可以灵活控制遍历深度和顺序。无论选择哪种方式,遍历文件夹都是访问文件系统中重要内容的基本操作之一。 ### 回答3: 遍历文件夹是指对指定的文件夹进行逐个查找和检索其中的文件文件夹的过程。 在计算机编程中,实现文件夹遍历通常需要使用递归算法。具体步骤如下: 1. 首先,我们需要指定一个顶层文件夹作为起始点。可以是任意一个已存在的文件夹。 2. 然后,我们通过读取起始文件夹的内容(包括文件文件夹),获取这些内容的相关信息,例如文件名、文件类型、文件大小等。 3. 对于每一个文件夹,我们将重复步骤2,进一步查找其中的文件文件夹。这就是递归的过程,直到遍历到最底层的文件夹。 4. 遍历文件夹的过程中,可以根据需要进行文件的筛选,例如只处理某些特定类型的文件。 5. 最后,我们可以对遍历到的每一个文件进行自定义的操作,例如打印文件路径、复制文件、修改文件等。 通过遍历文件夹,我们可以方便地获取指定文件夹下的所有文件,对其进行批量处理,例如备份、删除、搜索等。这在文件管理、数据处理和程序开发中都是常见的应用场景。 需要注意的是,对于大型文件夹或者文件夹层级很深的情况下,可能会遇到性能问题,因此在实际开发时需要进行优化,例如通过并行处理来提高遍历速度,避免资源浪费和耗时过长。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElminsterAumar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值