Uploaded by Артем Зуев

ООП РТЗ ПЗ№3

advertisement
Задание
Написать программу на языке C++ с использованием классов и наследования,
которая будет производить поиск файлов по заданному имени в заданной
папке и подпапках, и затем выводить на экран файлы, содержащие в имени
заданные символы.
Блок-схема работы программы
Код программы
SearchFile.h
#include <sys/stat.h>
#include <iostream>
#include <string>
#include <experimental/filesystem>
using namespace std::experimental::filesystem;
class FilePath {
private:
std::string directory_path_name;
std::string subdirectory_name;
std::string file_name;
public:
FilePath(std::string d_path_name, std::string d_name, std::string file_name_d) :
directory_path_name(d_path_name), subdirectory_name(d_name),
file_name(file_name_d) {}
static void search_file(FilePath& file) {
for (const auto& file_iter : directory_iterator(file.directory_path_name.c_str())) {
auto file_info = file_iter.status();
auto file_type = file_info.type();
if (file_type == file_type::directory) {
std::string update_path = file_iter.path().string();
FilePath update_file_path = FilePath(update_path,
file.subdirectory_name, file.file_name);
FilePath::search_file(update_file_path);
}
else if (file_type == file_type::regular) {
std::string file_name1 = file_iter.path().filename().u8string();
bool is_file_true = false;
for (int i = 0; i < file.file_name.length(); i++) {
for (int j = 0; j < file_name1.length(); j++) {
if (file_name1[j] == file.file_name[i]) { is_file_true
= true; }
}
if (is_file_true == false) break;
else {
if (i == (file.file_name.length() - 1)) {}
else { is_file_true = false; }
}
}
if (is_file_true == true) {
std::cout << "Файл с символами " << file.file_name << "
находится в папке " << file_iter.path() << std::endl;
}
}
else {}
}
}
};
SearchFile.cpp
#include <iostream>
#include <string>
#include "SearchFile.h"
#include <locale>
int main()
{
setlocale(LC_ALL, "RUSSIAN");
char main_directory_char[200];
char file_name_char[200];
std::cout << "Введите расположение папки для поиска файла: ";
scanf("%s", main_directory_char);
std::cout << "Введите имя файла: ";
scanf("%s", file_name_char);
std::string main_directory(main_directory_char);
std::string file_name(file_name_char);
FilePath dir_path = FilePath(main_directory, "", file_name_char);
FilePath::search_file(dir_path);
}
Результат работы программы
Дополнение
std::filesystem предоставляет функцию, которая используется для
определения того, существует ли уже файл или каталог с указанным путем или
статусом. Для этого мы реализуем программу, в которой мы импортируем
библиотечную «файловую систему» и создаем функцию void «демо». Для
демонстрационной функции мы указываем путь и функцию статуса из
файловой системы класса. Затем мы используем условие if-else, чтобы вернуть
утверждение о существовании файла.
Класс directory_iterator - Описывает итератор ввода, выполняющий
последовательный перебор имен файлов в каталоге. Для итератора X
выражение *X вычисляет объект класса directory_entry , который заключает
имя файла и все, что известно о его состоянии. Класс хранит объект типа path,
вызываемый mydir здесь в целях экспозиции, который представляет имя
каталога для последовательности, и объект типа directory_entry ,
вызываемого myentry здесь, который представляет текущее имя файла в
последовательности каталогов. Созданный по умолчанию объект
типа directory_entry имеет пустое mydir имя пути и представляет итератор
конца последовательности.
Класс
directory_entry
где X — directory_iterator.
-
Описывает
объект,
Класс file_status - Создает оболочку для file_type.
File_type:
enum class file_type {
not_found = -1,
none,
regular,
directory,
symlink,
block,
character,
fifo,
socket,
unknown
};
возвращаемый *X,
Класс path хранит объект типа string_type, называемый myname здесь в целях
демонстрации,
подходящий
для
использования
в
качестве
пути. string_type является
синонимом
для basic_string<value_type>,
где value_type является синонимом для wchar_t в Windows.
Заголовок <filesystem> предоставляет directory_iterator тип для итерации по
отдельным
каталогам,
а recursive_directory_iterator класс
выполняет
рекурсивную итерацию по каталогу и его подкаталогам. После создания
итератора путем передачи ему объекта path итератор указывает на первое
значение directory_entry в пути. Создайте конечный итератор путем вызова
конструктора по умолчанию.
При итерации по каталогу можно обнаружить несколько типов элементов. К
ним относятся каталоги, файлы, символьные ссылки, файлы сокетов и другие.
Возвращает directory_iterator элементы в виде directory_entry объектов.
Рекурсия - это такой способ организации обработки данных, при котором
программа вызывает сама себя непосредственно, либо с помощью других
программ.
Рекурсивная функция - это функция, для которой существует алгоритм
вычисления ее значений по произвольному значению аргумента.
Итерация - способ организации обработки данных, при котором определенные
действия повторяются многократно, не приводя при этом к рекурсивным
вызовам программ.
0
Download