【c++】c++11(使用系统API)遍历指定目录里面的文件

作者 : admin 本文共2519个字,预计阅读时间需要7分钟 发布时间: 2024-06-11 共1人阅读

这个是c++17的

//c++17的
#include 
#include 
 
namespace fs = std::filesystem;
 
int main() {
    std::string path = "/path/to/directory"; // 替换为你的目录路径
 
    try {
        for (const auto& entry : fs::directory_iterator(path)) {
            const auto filename = entry.path().filename();
            if (entry.is_directory()) {
                std::cout << "Dir: " << filename << std::endl;
            } else if (entry.is_regular_file()) {
                std::cout << "File: " << filename << std::endl;
            } else {
                std::cout << "Other: " << filename << std::endl;
            }
        }
    } catch (const fs::filesystem_error& e) {
        std::cerr << e.what() << std::endl;
    }
 
    return 0;
}

这个是使用系统API遍历的(windows)。

#include 
#include 
#include 
#include 
std::vector<std::string> GetFiles(const std::string& directoryPath)
{
std::vector<std::string> filePaths;
std::string searchPattern = directoryPath + "\*";
WIN32_FIND_DATAA findData;
HANDLE hFind = FindFirstFile(searchPattern.c_str(), &findData);
if (hFind == INVALID_HANDLE_VALUE)
{
std::cerr << "find directory is Failed: " << directoryPath << std::endl;
return filePaths;
}
do
{
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// 过滤 "."和".."目录 
if (strcmp(findData.cFileName, ".") == 0 || strcmp(findData.cFileName, "..") == 0)
continue;
std::string subDirectoryPath = directoryPath + "\" + findData.cFileName;
std::vector<std::string> subDirectoryFilePaths = GetFiles(subDirectoryPath);
filePaths.insert(filePaths.end(), subDirectoryFilePaths.begin(), subDirectoryFilePaths.end());
}
else
{
std::string filePath = directoryPath + "\" + findData.cFileName;
filePaths.push_back(filePath);
}
} while (FindNextFileA(hFind, &findData));
FindClose(hFind);
return filePaths;
}
int main()
{
std::string directoryPath = "B:\share\202406";
std::vector<std::string> filePaths = GetFiles(directoryPath);
for (const auto& filePath : filePaths)
{
std::cout << filePath << std::endl;
}
system("pause");
return 0;
}

这个是Linux的

#include 
#include 
#include 
#include 
using namespace std;
static bool endsWith(const std::string& str, const std::string& suffix) {
return str.size() >= suffix.size() &&
str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0;
}
static void findXmlFiles(const std::string& directory, std::vector<std::string> &xmlFiles) {
DIR* dir;
struct dirent* ent;
if ((dir = opendir(directory.c_str())) != NULL) {
while ((ent = readdir(dir)) != NULL) {
std::string path = directory + "/" + ent->d_name;
if (ent->d_type == DT_DIR) {
// 如果是目录且不是.或..,则递归调用
if (strcmp(ent->d_name, ".") != 0 && strcmp(ent->d_name, "..") != 0) {
findXmlFiles(path, xmlFiles);
}
} else if (endsWith(path, ".xml")) {
// 如果是.xml文件,打印路径
std::cout << "Found XML file: " << path << std::endl;
xmlFiles.push_back(path);
}
}
closedir(dir);
} else {
// 打开目录失败
std::cerr << "Error opening directory: " << directory << std::endl;
}
}
int main(int argc, char *argv[])
{
std::string directory("/root/solutionTest"); // 替换为你的目录路径
//findXmlFiles(directory);
本站无任何商业行为
个人在线分享 » 【c++】c++11(使用系统API)遍历指定目录里面的文件
E-->