windows和Linux c++遍历文件目录

1. windows文件目录遍历

#include <string>

#include <Windows.h>
#include <io.h>
#include <vector>
using namespace std;

void getFiles(const std::string& dir, std::vector<string>& files, const std::string filter_type="*.*")
{
	//文件句柄
	intptr_t   hFile = 0;
	//文件信息
	struct _finddata_t fileinfo;
	std::string path = dir + "\\" + filter_type;
	//string p = "F:\\TY_code\\sqliteR8\\TySrvDevelop\\bin\\TY-CM-2116A2-V1\\snap\\*.jpg";
	if ((hFile = _findfirst(path.c_str(), &fileinfo)) != -1)
	{
		do
		{
			//如果是目录,迭代之
			//如果不是,加入列表
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
					getFiles(fileinfo.name, files);
			}
			else
			{
				string dir = path.substr(0, path.find_last_of("\\")+1);
				files.push_back(dir + fileinfo.name);
			}
		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}

2. Linux文件目录遍历

#include <dirent.h>
#include <string.h>
#include <iostream>
#include <vector>
#include <string>
 
namespace {
 
void Usage(const char* exe)
{
	fprintf(stderr, "input params error, run this exe as following command line:\n");
	fprintf(stderr, "\t%s arg1 arg2 arg3\n", exe);
	fprintf(stderr, "\targ1: specify the directory to traverse\n");
    fprintf(stderr, "\targ2: type:\n"
        "\t\t0: tarverse all files and all directories in directory;\n"
        "\t\t1: only tarverse all files, don't include directories in directory;\n"
        "\t\t2: only tarverse all directories, don't include files in directory.\n");
    fprintf(stderr, "\targ3: optional, filter, default is *, which is don't filter. \n");
	fprintf(stderr, "for example(support relative path), only traverse jpg image:\n");
	fprintf(stderr, "\t%s ./images 0 .jpg\n", exe);
    fprintf(stderr, "##### test fail #####\n");
}
 
// 遍历指定文件夹下的所有文件,不包括指定文件夹内的文件夹
std::vector<std::string> GetListFiles(const std::string& path, const std::string& exten = "*")
{
    std::vector<std::string> list;
    list.clear();
 
    DIR* dp = nullptr;
    struct dirent* dirp = nullptr;
    if ((dp = opendir(path.c_str())) == nullptr) {
        return list;
    }
 
    while ((dirp = readdir(dp)) != nullptr) {
        if (dirp->d_type == DT_REG) {
            if (exten.compare("*") == 0)
                list.emplace_back(static_cast<std::string>(dirp->d_name));
            else
                if (std::string(dirp->d_name).find(exten) != std::string::npos)
                    list.emplace_back(static_cast<std::string>(dirp->d_name));
        }
    }
 
    closedir(dp);
 
    return list;
}
 
// 遍历指定文件夹下的所有文件夹,不包括指定文件夹下的文件
std::vector<std::string> GetListFolders(const std::string& path, const std::string& exten = "*")
{
    std::vector<std::string> list;
    list.clear();
 
    DIR* dp = nullptr;
    struct dirent* dirp = nullptr;
    if ((dp = opendir(path.c_str())) == nullptr) {
        return list;
    }
 
    while ((dirp = readdir(dp)) != nullptr) {
        if (dirp->d_type == DT_DIR && strcmp(dirp->d_name, ".") != 0 && strcmp(dirp->d_name, "..") != 0) {
            if (exten.compare("*") == 0)
                list.emplace_back(static_cast<std::string>(dirp->d_name));
            else
                if (std::string(dirp->d_name).find(exten) != std::string::npos)
                    list.emplace_back(static_cast<std::string>(dirp->d_name));
        }
    }
 
    closedir(dp);
 
    return list;
}
 
// 遍历指定文件夹下的所有文件,包括指定文件夹内的文件夹
std::vector<std::string> GetListFilesR(const std::string& path, const std::string& exten = "*")
{
    std::vector<std::string> list = GetListFiles(path, exten);
 
    std::vector<std::string> dirs = GetListFolders(path, exten);
 
    for (auto it = dirs.cbegin(); it != dirs.cend(); ++it) {
        std::vector<std::string> cl = GetListFiles(*it, exten);
        for (auto file : cl) {
            list.emplace_back(*it + "/" + file);
        }
    }
 
    return list;
}
 
} // namespace
 
int main(int argc, char* argv[])
{
    if (argc < 3 || argc > 4) {
        Usage(argv[0]);
        return -1;
    }
 
    int type = atoi(argv[2]);
    std::string exten = "*";
    if (argc == 4) exten = std::string(argv[3]);
 
    std::vector<std::string> vec;
    if (type == 0) vec = GetListFilesR(std::string(argv[1]), exten);
    else if (type == 1) vec = GetListFiles(std::string(argv[1]), exten);
    else if (type == 2) vec = GetListFolders(std::string(argv[1]), exten);
    else { Usage(argv[0]); return -1;}
 
    fprintf(stdout, "traverse result: files count: %d\n", vec.size());
    for (auto& file : vec) {
        fprintf(stderr, "\t%s\n", file.c_str());
    }
 
    fprintf(stdout, "===== test success =====\n");
}

参考:
https://blog.csdn.net/fengbingchun/article/details/80154708

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Linux下,可以使用dirent.h头文件的相关函数来遍历文件夹。下面是一个示例代码,可以用来遍历文件夹并获取文件名: ```cpp #include <iostream> #include <vector> #include <dirent.h> #include <cstring> void GetFileNames(const std::string& path, std::vector<std::string>& filenames) { DIR *pDir; struct dirent* ptr; if(!(pDir = opendir(path.c_str()))){ std::cout << "Folder doesn't Exist!" << std::endl; return; } while((ptr = readdir(pDir))!=0) { if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0){ filenames.push_back(path + "/" + ptr->d_name); } } closedir(pDir); } int main() { std::string folderPath = "./folder"; std::vector<std::string> filenames; GetFileNames(folderPath, filenames); for(const auto& filename : filenames) { std::cout << filename << std::endl; } return 0; } ``` 这段代码使用了`opendir`函数打开文件夹,然后使用`readdir`函数遍历文件夹的文件。通过判断文件名是否为"."或".."来排除当前目录和上级目录。最后使用`closedir`函数关闭文件夹。你可以根据自己的需求修改代码的文件夹路径和处理文件的逻辑。 #### 引用[.reference_title] - *1* *3* [windows/Linux C++遍历文件夹里的所有文件并进行读写](https://blog.csdn.net/baidu_35231778/article/details/113849845)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [LinuxC++ 遍历文件夹下的文件名](https://blog.csdn.net/weixin_38419133/article/details/103561532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值