Alarm Clock and File Processor
Демострация работы программы
https://disk.yandex.ru/i/H2hXLyAEjbcNpQ
UML диаграмма
Описание программы
Эта программа выполняет две основные функции:
- Будильник: Ждет определенное время, чтобы сработать как будильник.
- Рекурсивный поиск и обработка файлов: Рекурсивно ищет файлы с определенным паттерном в имени в заданной директории, читает данные из найденных файлов, выводит информацию о них и создает новые файлы с результатами.
Компиляция и запуск
Для компиляции программы используйте компилятор 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++ реализованы две основные функции: будильник и рекурсивный поиск файлов для их обработки. Рассмотрим каждую часть кода по отдельности:
-
Подключение библиотек:
#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>
Здесь подключаются библиотеки для работы с вводом-выводом, обработки даты и времени, файловой системы и низкоуровневой работы с файлами.
-
Функция
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
ожидает наступления определенного времени (часы и минуты), и когда это время наступает, выводит сообщение о срабатывании будильника и прерывает цикл. -
Функция
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
и создается новый файл с этим расширением, содержащий прочитанные данные. -
Функция
findFilesRecursively
:void findFilesRecursively(char* basePath, const char* searchPattern) { char path[200]; struct find_t fileInfo; ... // Здесь происходит рекурсивный поиск файлов по шаблону и их обработка }
Функция ищет файлы в указанной директории и её поддиректориях, соответствующие шаблону. Для файлов, не являющихся поддиректориями, вызывается
processFile
. -
Главная функция
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.