Страницы

Поиск по вопросам

суббота, 27 октября 2018 г.

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

Нужно найти файл по расширению в известной директории. Для винды существует такое решение:
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#, объясните простым языком


Ответ

В С++17 появился новый крутой инклюд для работы с файловой системой:
Им и воспользуйтесь.
Код ниже делает поиск непосредственно в выбранной папке, без подпапок. Если нужен рекурсивный поиск, замените directory_iterator на recursive_directory_iterator
#include #include #include #include
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 << '
'; } } catch (std::exception &e) { std::cout << "Error: " << e.what() << '
'; } }

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

Комментариев нет:

Отправить комментарий