#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.
Комментариев нет:
Отправить комментарий