readme.md

Alarm Clock and File Processor

Демострация работы программы

https://disk.yandex.ru/i/H2hXLyAEjbcNpQ

UML диаграмма

alt text

Описание программы

Эта программа выполняет две основные функции:

  1. Будильник: Ждет определенное время, чтобы сработать как будильник.
  2. Рекурсивный поиск и обработка файлов: Рекурсивно ищет файлы с определенным паттерном в имени в заданной директории, читает данные из найденных файлов, выводит информацию о них и создает новые файлы с результатами.

Компиляция и запуск

Для компиляции программы используйте компилятор g++:

g++ lab5_cikl_3.cpp -o lab5_cikl_3

Запуск программы осуществляется следующим образом:

./alarm_clock

Пояснение коду

Функция alarmClock

void alarmClock(int hour, int minutes) {
   while (true) {
       time_t now = time(0);
       struct tm *localTime = localtime(&now);
       if (localTime->tm_hour == hour && localTime->tm_min == minutes) {
           std::cout << "__\n" << "ALARM! It's time to start the task!" << std::endl;
           break;
       }
       sleep(60); // Пауза на 60 секунд
   }
}

Эта функция принимает часы и минуты в качестве параметров и ждет, пока текущее время не совпадет с заданным. Когда время наступает, функция выводит сообщение и завершает работу.

Функция processFile

void processFile(const char* filePath) {
   int Handle = open(filePath, O_RDONLY);
   if (Handle != -1) {
       float data[10];
       ssize_t bytesRead = read(Handle, data, sizeof(data));
       std::cout << "Opened " << filePath << " and read " << bytesRead << " bytes.\n" << "__\n";
       close(Handle);

       struct stat fileInfo;
       if (stat(filePath, &fileInfo) == 0) {
           std::cout << "File Path: " << filePath << "\n";
           std::cout << "File Size: " << fileInfo.st_size << " bytes\n";

           struct tm *modTime = localtime(&fileInfo.st_mtime);
           std::cout << "Last Modified Date: " << modTime->tm_mday << "/" << modTime->tm_mon + 1 << "/" << modTime->tm_year + 1900 << "\n";
           std::cout << "Last Modified Time: " << modTime->tm_hour << ":" << modTime->tm_min << ":" << modTime->tm_sec << "\n";
       } else {
           std::cout << "Error getting file info\n";
       }

       std::string resFilePath = std::string(filePath);
       resFilePath = resFilePath.substr(0, resFilePath.find_last_of(".")) + ".res";

       Handle = open(resFilePath.c_str(), O_CREAT | O_TRUNC | O_RDWR, S_IRWXU);
       if (Handle != -1) {
           write(Handle, data, sizeof(data));
           close(Handle);
           std::cout << resFilePath << " has been created with data from " << filePath << "\n";
       } else {
           std::cout << "Error creating " << resFilePath << "\n";
       }
   } else {
       std::cout << "Error opening " << filePath << "\n";
   }
}

Эта функция открывает файл, читает из него данные и выводит информацию о файле, включая путь, размер и время последнего изменения. Затем создает новый файл с расширением .res, в который записывает прочитанные данные.

Функция findFilesRecursively

void findFilesRecursively(const char* basePath, const char* searchPattern) {
   DIR *dir;
   struct dirent *entry;
   if ((dir = opendir(basePath)) != nullptr) {
       while ((entry = readdir(dir)) != nullptr) {
           if (entry->d_type == DT_REG) {
               std::string filePath = std::string(basePath) + "/" + entry->d_name;
               if (strstr(entry->d_name, searchPattern)) {
                   processFile(filePath.c_str());
               }
           } else if (entry->d_type == DT_DIR) {
               if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) {
                   std::string subDirPath = std::string(basePath) + "/" + entry->d_name;
                   findFilesRecursively(subDirPath.c_str(), searchPattern);
               }
           }
       }
       closedir(dir);
   } else {
       std::cerr << "Could not open directory: " << basePath << std::endl;
   }
}
  • Система: Ubuntu или совместимая операционная система.
  • Компилятор: Требуется компилятор C++, поддерживающий старые заголовочные файлы, такие как iostream.h, conio.h, dos.h.

Сборка и запуск:

Для компиляции программы используйте любой компилятор C++, который поддерживает заголовочные файлы, используемые в программе. Программа запускается из командной строки или через исполняемый файл в среде ubuntu.

Важное замечание:

Эта программа написана для образовательных целей и предназначена для использования в среде, которая поддерживает стандарты и библиотеки C++ в ubuntu. В других операционных системах её функциональность может быть ограничена.

Некоторые пояснения по программе:

В этом коде на C++ реализованы две основные функции: будильник и рекурсивный поиск файлов для их обработки. Рассмотрим каждую часть кода по отдельности:

  1. Подключение библиотек:

    #include <iostream.h>
    #include <dos.h>
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <dir.h>
    #include <io.h>
    #include <fcntl.h>
    #include <sys\stat.h>
    

    Здесь подключаются библиотеки для работы с вводом-выводом, обработки даты и времени, файловой системы и низкоуровневой работы с файлами.

  2. Функция alarmClock:

    void alarmClock(int hour, int minutes) {
        struct time t;
        while(1) {
            gettime(&t);
            if(t.ti_hour == hour && t.ti_min == minutes) {
                cout  << "__________\n" << "ALARM! It's time to start the task!" << endl;
                break;
            }
        }
    }
    

    Функция alarmClock ожидает наступления определенного времени (часы и минуты), и когда это время наступает, выводит сообщение о срабатывании будильника и прерывает цикл.

  3. Функция processFile:

    void processFile(const char* filePath) {
        int Handle = open(filePath, O_RDONLY | O_BINARY);
        if (Handle != -1) {
            float data[10];
            int bytesRead = read(Handle, data, sizeof(data));
            cout << "Opened " << filePath << " and read " << bytesRead << " bytes.\n" <<"__________\n";
            close(Handle);
            ...
            // Здесь идет дальнейшая обработка информации о файле и создание файла .res
        } else {
            cout << "Error opening " << filePath << "\n";
        }
    }
    

    В этой функции открывается файл, из него читаются данные, выводится информация о файле, меняется расширение файла на .res и создается новый файл с этим расширением, содержащий прочитанные данные.

  4. Функция findFilesRecursively:

    void findFilesRecursively(char* basePath, const char* searchPattern) {
        char path[200];
        struct find_t fileInfo;
        ...
        // Здесь происходит рекурсивный поиск файлов по шаблону и их обработка
    }
    

    Функция ищет файлы в указанной директории и её поддиректориях, соответствующие шаблону. Для файлов, не являющихся поддиректориями, вызывается processFile.

  5. Главная функция main:

    int main() {
        int hour, minutes;
        char directory[200];
        cout << "Enter the hour of the alarm (0-23): ";
        cin >> hour;
        cout << "Enter the minutes of the alarm (0-59): ";
        cin >> minutes;
        cout << "Enter the directory to search for files: ";
        cin >> directory;
        alarmClock(hour, minutes);
        findFilesRecursively(directory, "virus.dat"); // Поиск файлов virus.dat
        getch(); // Ожидание нажатия клавиши
        return 0;
    }
    

    В main собираются данные от пользователя (время будильника и директория поиска), активируется будильник и начинается поиск файлов с помощью findFilesRecursively. Эта функция рекурсивно ищет файлы с заданным паттерном в имени (например, “virus”) в директории и ее поддиректориях, и вызывает функцию processFile для каждого найденного файла.

Функция main

int main() {
   int hour, minutes;
   char directory[200];

   std::cout << "Enter the hour of the alarm (0-23): ";
   std::cin >> hour;
   std::cout << "Enter the minutes of the alarm (0-59): ";
   std::cin >> minutes;
   std::cout << "Enter the directory to search for files: ";
   std::cin >> directory;

   alarmClock(hour, minutes);
   findFilesRecursively(directory, "virus");

   std::cout << "Press any key to exit...\n";
   std::cin.ignore();
   std::cin.get();
   return 0;
}

В `main функция запрашивает у пользователя время для будильника и директорию для поиска файлов. Затем вызывает функции alarmClock и findFilesRecursively.

Конвейеры
0 успешных
0 с ошибкой