Страницы

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

вторник, 10 декабря 2019 г.

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

#cpp #linux #файлы #поиск #g++


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

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#, объясните простым языком
    


Ответы

Ответ 1



В С++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 << '\n'; } } catch (std::exception &e) { std::cout << "Error: " << e.what() << '\n'; } } Чтобы это работало в GCC, нужен флаг -std=c++17 (или -std=gnu++17), и нужно подключить библиотеку -lstdc++fs.

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

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