Чтение всех имен файлов в каталоге - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь прочитать все имена файлов, присутствующие в определенном каталоге.Я сделал программу на C ++, но она печатает только файлы прямо в этом каталоге.Я хочу, чтобы все файлы, которые также присутствуют в подкаталоге.

Я написал программу на c ++, которая печатает имена файлов в каталоге, но я также хочу, чтобы все имена файлов в подкаталоге.

#include <stdio.h>
#include <windows.h>
#include <bits/stdc++.h>
#include <dirent.h>
using namespace std;

#include <sys/types.h>
#include <sys/stat.h>
#ifndef WIN32
#include <unistd.h>
#endif

#ifdef WIN32
#define stat _stat
#endif

int main ()
{
    DIR *dir;
    struct dirent *ent;
    if ((dir = opendir ("c:\\test")) != NULL) {
        /* print all the files and directories within directory */
        while ((ent = readdir (dir)) != NULL) {
            printf ("%s\n", ent->d_name);
        }
        closedir (dir);
    } else {
        /* could not open directory */
        perror ("");
        return EXIT_FAILURE;
    }
}

Фактический результат : 1.Печатка имен файлов, находящихся непосредственно в каталоге, и печать имени подкаталога.

Ожидаемый : я хочу вместо печати имени подкаталогапрограмма должна напечатать имена файлов в этом подкаталоге.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Если у вас есть C ++ 17, используйте recursive_directory_iterator.Если нет, вы можете использовать dirent.h -функции.Рассмотрим, например, следующую обобщенную traverseFiles -функцию, которая передает каждый найденный файл функции, которая обрабатывает обнаруженный файл:

#include <iostream>
#include <dirent.h>
#include <string>

void traverseFiles(const std::string &path, std::function<void(const std::string &)> cb) {
    if (auto dir = opendir(path.c_str())) {
        while (auto f = readdir(dir)) {
            if (f->d_name[0] == '.') continue;

            if (f->d_type == DT_DIR)
                traverseFiles(path + f->d_name + "/", cb);

            if (f->d_type == DT_REG)
                cb(path + f->d_name);
        }
        closedir(dir);
    }
}


void fileDetected(const std::string &f) {
    std::cout << "file:" << f << std::endl;
}


int main() {
    traverseFiles("c:/somestartdir", &fileDetected);
}
0 голосов
/ 13 февраля 2019

Если вы используете ОС Windows, вы можете запустить приведенный ниже код, чтобы получить список файлов в предоставленном каталоге.

#include <windows.h>
#include <TCHAR.h>
#include <stdio.h>

void Enum(TCHAR root[0xFF])
{
    HANDLE hFind;
    WIN32_FIND_DATA wfd;
    TCHAR GeneralPath[0xFF];
    TCHAR AgainFolder[0xFF];
    TCHAR FileFullPath[0xFF];

    _stprintf(GeneralPath, _T("%s\\*.*"), root);
    hFind = FindFirstFile(GeneralPath, &wfd);

    if(INVALID_HANDLE_VALUE==hFind)
        return;

    do
    {
        if( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) //Checking Founded File Attribute is it File or Folder/Directory
        {
            if( !_tcscmp(wfd.cFileName, _T(".")) || !_tcscmp(wfd.cFileName, _T("..")) ) //if Founded directory is same(.) or parent(..) then ignore them
                continue;
            _stprintf(AgainFolder, _T("%s\\%s"), root, wfd.cFileName);
            Enum(AgainFolder); //Recursion because folder is inside another folder
        }
        else
        {
            _stprintf(FileFullPath, _T("%s\\%s"), root, wfd.cFileName); //  "Folder\\fileName.extension"
            _tprintf(_T("%s\n"),FileFullPath); 
        }

    }while(FindNextFile(hFind, &wfd));

    CloseHandle(hFind);
    hFind=INVALID_HANDLE_VALUE;
}
int main()
{
    TCHAR Folder[0xFF]=_T("c:\\windows");
    Enum(Folder);
    return 0;
}

Если вы хотите получить доступ к полному решению Visual Studio, вы можете клонировать это хранилище.

0 голосов
/ 13 февраля 2019

Использование C ++ 17 recursive_directory_iterator :

#include <filesystem>

void ls_recursive(const std::filesystem::path& path) {
    for(const auto& p: std::filesystem::recursive_directory_iterator(path)) {
        std::cout << p.path() << '\n';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...