Advertisement
Guest User

Untitled

a guest
May 24th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.22 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dirent.h>
  5. #include <errno.h>
  6. #include <unistd.h>
  7. #include <ctype.h>
  8. #include <sys/stat.h>
  9. #include <regex.h>
  10.  
  11. //Эта программа проходит по всем файлам и подпапкам и выводит названия тех файлов, в которых
  12. //написана электронная почта
  13.  
  14.  
  15. void del_mailfile(char *path) //на вход функции подается путь к папке типо /home/user/folder
  16. {
  17.     char *regstr = "[[:alnum:]\\.-]+@[[:alnum:]-]+\\.[[:alnum:]]+"; //регулярка для электронной почты
  18.     regex_t reg;
  19.     if (regcomp(&reg, regstr, REG_EXTENDED)) {
  20.         printf("Error reg\n");
  21.     } //все, что написано выше - процесс "сборки" регулярки. Можно почитать про regex.h на сайтах
  22.     char *new_path = calloc(255, sizeof(char));
  23.     DIR* dir = opendir(path); //открываем папку
  24.     char* textfile = calloc(200, sizeof(char));
  25.     if (dir) { //если папка открылась, значит можно работать с ней
  26.         struct dirent *de = readdir(dir); //эта функция "изучает" файл из папки. Каждый раз она будет "изучать" новый файл, пока они не закончатся
  27.         while (de) { //когда файлы закончатся, readdir() вернет NULL и цикл закончится. Это цикл "обхода" файлов.
  28.             if (strcmp(de->d_name, ".") != 0 && strcmp(de->d_name, "..") != 0) { //В Linux бывают папки с точками в названии. Их надо пропускать.
  29.                 strcpy(new_path, path); //у нашего файла новый путь, записываем его в
  30.                 strcat(new_path, "/"); //строку new_path
  31.                 strcat(new_path, de->d_name); //заметь, в de мы "изучаем" файл. Так вот de->d_name - имя файла. Подробнее гугли struct dirent СИ
  32.                 if (opendir(new_path)) { //если наш файл оказался папкой (то есть внутри исходной папки оказалась папка)
  33.                     del_mailfile(new_path); //то мы вызываем нашу функцию для этой папки. Она там будет делать то же самое, что и наша.
  34.                 } // Вот такая рекурсия. Встретили папку - "запустили" туда нашу функцию
  35.                 else { //если это не папка, значит это файл
  36.                     if (strcmp(de->d_name, "a.out") && strcmp(de->d_name, "lr32.c")) { //ну эти нам не надо изучать
  37.                         FILE *read = fopen(new_path, "r"); //открываем на чтение ("r") наш файл. Гугли fopen СИ
  38.                         fgets(textfile, 255, read); //считываем из файла строчку. Заметь, третьим аргументом указывается файл
  39.                         fclose(read); //закрываем файл. Обязательно делать.
  40.                         if (!regexec(&reg, textfile, 0, NULL, 0)) //если регулярка сработала (то есть в файле почта). Гугли regexec СИ
  41.                             printf("%s\n", de->d_name); //то печатаем название файла
  42.                             //remove(new_path); На защите лабы надо будет не печатать, а удалять файлы. Вот функция для этого
  43.                     }
  44.                 }
  45.             }
  46.             de = readdir(dir); //это мы в цикле while(de) переходим к новому файлу (смотри что написано в while(de))
  47.         }
  48.     }
  49.     free(textfile);
  50.     free(new_path);
  51.     closedir(dir); //Обязательно делать.
  52. }
  53.  
  54.  
  55. int main()
  56. {
  57.     char* name = (char*)malloc(PATH_MAX);
  58.     getcwd(name, PATH_MAX); //функция записывает в name путь к текущей папке, в которой находится программа
  59.     del_mailfile(name);
  60.     free(name);
  61.     return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement