Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <dirent.h>
- #include <errno.h>
- #include <unistd.h>
- #include <ctype.h>
- #include <sys/stat.h>
- #include <regex.h>
- //Эта программа проходит по всем файлам и подпапкам и выводит названия тех файлов, в которых
- //написана электронная почта
- void del_mailfile(char *path) //на вход функции подается путь к папке типо /home/user/folder
- {
- char *regstr = "[[:alnum:]\\.-]+@[[:alnum:]-]+\\.[[:alnum:]]+"; //регулярка для электронной почты
- regex_t reg;
- if (regcomp(®, regstr, REG_EXTENDED)) {
- printf("Error reg\n");
- } //все, что написано выше - процесс "сборки" регулярки. Можно почитать про regex.h на сайтах
- char *new_path = calloc(255, sizeof(char));
- DIR* dir = opendir(path); //открываем папку
- char* textfile = calloc(200, sizeof(char));
- if (dir) { //если папка открылась, значит можно работать с ней
- struct dirent *de = readdir(dir); //эта функция "изучает" файл из папки. Каждый раз она будет "изучать" новый файл, пока они не закончатся
- while (de) { //когда файлы закончатся, readdir() вернет NULL и цикл закончится. Это цикл "обхода" файлов.
- if (strcmp(de->d_name, ".") != 0 && strcmp(de->d_name, "..") != 0) { //В Linux бывают папки с точками в названии. Их надо пропускать.
- strcpy(new_path, path); //у нашего файла новый путь, записываем его в
- strcat(new_path, "/"); //строку new_path
- strcat(new_path, de->d_name); //заметь, в de мы "изучаем" файл. Так вот de->d_name - имя файла. Подробнее гугли struct dirent СИ
- if (opendir(new_path)) { //если наш файл оказался папкой (то есть внутри исходной папки оказалась папка)
- del_mailfile(new_path); //то мы вызываем нашу функцию для этой папки. Она там будет делать то же самое, что и наша.
- } // Вот такая рекурсия. Встретили папку - "запустили" туда нашу функцию
- else { //если это не папка, значит это файл
- if (strcmp(de->d_name, "a.out") && strcmp(de->d_name, "lr32.c")) { //ну эти нам не надо изучать
- FILE *read = fopen(new_path, "r"); //открываем на чтение ("r") наш файл. Гугли fopen СИ
- fgets(textfile, 255, read); //считываем из файла строчку. Заметь, третьим аргументом указывается файл
- fclose(read); //закрываем файл. Обязательно делать.
- if (!regexec(®, textfile, 0, NULL, 0)) //если регулярка сработала (то есть в файле почта). Гугли regexec СИ
- printf("%s\n", de->d_name); //то печатаем название файла
- //remove(new_path); На защите лабы надо будет не печатать, а удалять файлы. Вот функция для этого
- }
- }
- }
- de = readdir(dir); //это мы в цикле while(de) переходим к новому файлу (смотри что написано в while(de))
- }
- }
- free(textfile);
- free(new_path);
- closedir(dir); //Обязательно делать.
- }
- int main()
- {
- char* name = (char*)malloc(PATH_MAX);
- getcwd(name, PATH_MAX); //функция записывает в name путь к текущей папке, в которой находится программа
- del_mailfile(name);
- free(name);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement