Поиск файла по расширению C++

177
23 сентября 2018, 06:20

Нужно найти файл по расширению в известной директории. Для винды существует такое решение:

FindFirstFile("Some/Directory/Some/*.some");

А как такое же провернуть под Linux, ибо подход описанный выше не работает и не заработает в Linux. Уже имеется вот такой код:

cout << "Type path - ";
string path_to;
getline(cin, path_to);
cout << "Type filename - ";
string filename;
getline(cin, filename);
string result = path_to + "/" + filename;
FindFirstFile(result);//знаю, что другое что-то использовать нужно вот и спрашиваю.

Вчера начал изучать C++ после C#, объясните простым языком

Answer 1

В С++17 появился новый крутой инклюд для работы с файловой системой: <filesystem>.

Им и воспользуйтесь.

Код ниже делает поиск непосредственно в выбранной папке, без подпапок. Если нужен рекурсивный поиск, замените directory_iterator на recursive_directory_iterator.

#include <exception>
#include <filesystem>
#include <iostream>
#include <string>
namespace fs = std::filesystem; // Чтобы не писать `std::filesystem` каждый раз
int main()
{
    std::string directory_name = "some/directory";
    std::string extension = ".ext";
    try // Может быть исключение, например, если папки не существует
    {
        for (auto &p : fs::directory_iterator(directory_name)) // Для всех файлов в папке
        {
            if (!fs::is_regular_file(p.status()))
                continue; // Пропускаем, если это не простой файл, а папка или что-то другое
            std::string name(p.path().filename());
            // Проверяем, что имя заканчивается нужным расширением
            // В С++20 можно будет просто `bool match = name.ends_with(extension);`
            bool match = !name.compare(name.size() - extension.size(), extension.size(), extension);
            if (!match)
                continue;
            // Тут делаем с путем то, что нужно
            std::cout << name << '\n';
        }
    }
    catch (std::exception &e)
    {
        std::cout << "Error: " << e.what() << '\n';
    }
}

Чтобы это работало в GCC, нужен флаг -std=c++17 (или -std=gnu++17), и нужно подключить библиотеку -lstdc++fs.

READ ALSO
Утечка памяти (GDI+)

Утечка памяти (GDI+)

Почему происходит утечка памяти?

192
Как добавить флаг -std=c++17 или -std=gnu++17

Как добавить флаг -std=c++17 или -std=gnu++17

Пишу программу на C++ в Linux в среде NetBeansIDEХочу использовать #include <fillesystem>, чтобы ее использовать нужно добавить флаг -std=c++17 или -std=gnu++17

225
Отображение в cout уникальных рандомных чисел

Отображение в cout уникальных рандомных чисел

Пробовал отсеивать через if, но не получилосьПоможете реализовать?

196