Advertisement
anticlown

Lab_6(recursive dir search)

Nov 28th, 2023 (edited)
682
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <sys/time.h>
  6.  
  7. #include <dirent.h>
  8. #include <fcntl.h>
  9. #include <errno.h>
  10. #include <string.h>
  11. #include <malloc.h>
  12.  
  13. /*      search func start       */
  14. void searchFiles(const char searchingSymbol, int *numberOfFiles, const char *catalogPath, FILE *outputFilePointer)
  15. {
  16.     DIR *dir;
  17.     struct dirent *entry;
  18.     dir = opendir(catalogPath);
  19.  
  20.     if (!dir) // попытка отрыть каталог
  21.     {
  22.         printf("\t\t\tОшибка при открытии %s!\n", catalogPath);
  23.         return;
  24.     };
  25.  
  26.     while ((entry = readdir(dir)) != NULL) // пока не кончатся файлы в каталоге
  27.     {
  28.         const char *slash = "/";
  29.         char *fullPath = calloc(strlen(catalogPath) + strlen(slash) + strlen(entry->d_name), 1); // buff - после конкатенации становится полным путем к файлу, который
  30.                                                                                                  // обнаружили с помощью if'a выше
  31.         strcat(fullPath, catalogPath);
  32.         strcat(fullPath, slash);
  33.         strcat(fullPath, entry->d_name);
  34.         if (entry->d_type == 4) // если тип файла - каталог
  35.         {
  36.             if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) // каталог не является текущим(.) или родительскиим(..)
  37.             {
  38.                 searchFiles(searchingSymbol, numberOfFiles, fullPath, outputFilePointer);
  39.             }
  40.         }
  41.         else // иначе - любой другой тип файла
  42.         {
  43.             if (entry->d_name[0] == searchingSymbol) // если равны первый символ названия файла и символ для поиска
  44.             {
  45.                 FILE *filePointer;
  46.                 struct stat buff;
  47.                 if ((filePointer = fopen(fullPath, "rb")) == NULL)
  48.                 {
  49.                     printf("Не удалось прочитать данные о файле %s.\n", entry->d_name);
  50.                 }
  51.                 else
  52.                 {
  53.                     stat(fullPath, &buff);
  54.                     printf("\n\n\tНазвание: %s\n\tРазмер: %ld байт\n\tПолный путь: %s", entry->d_name, buff.st_size, fullPath);
  55.  
  56.                     fprintf(outputFilePointer, "Название: %s\n\tРазмер: %ld байт\n\tПолный путь: %s\n\n", entry->d_name, buff.st_size, fullPath);
  57.                     fclose(filePointer);
  58.                     ++(*numberOfFiles);
  59.                 }
  60.             }
  61.         }
  62.     };
  63.     closedir(dir);
  64. }
  65. /*      search func end       */
  66.  
  67. /*      print procedures start      */
  68. void printTaskInfo()
  69. {
  70.     printf("\tДанная программа ищет в заданном каталоге и всех его подкаталогах все файлы,\n\t\tимена которых начинаются с заданного определенного символа.\n\t\t\tРезультаты выводятся на консоль и в указанный файл.\n\n");
  71. }
  72. /*      print procedures end        */
  73.  
  74. int main(int argc, char *argv[], char *envp[])
  75. {
  76.     const int NUM_OF_ARGS = 4;
  77.  
  78.     printTaskInfo();
  79.     if (argc != NUM_OF_ARGS)
  80.     {
  81.         fprintf(stderr, "Неверный ввод!\nФормат ввода: %s <заданный каталог> <символ для поиска> <файл вывода>\n", argv[0]);
  82.         printf("Повторите запуск программы!");
  83.         return 1;
  84.     }
  85.  
  86.     const char *catalogPath = argv[1];
  87.     const char symbolForSearch = argv[2][0]; // берем первый символ второго аргумента для поиска
  88.     const char *outputFilePath = argv[3];
  89.  
  90.     int numberOfFiles = 0;
  91.     FILE *outputFilePointer = fopen(outputFilePath, "w");
  92.  
  93.     if (outputFilePointer)
  94.     {
  95.  
  96.         printf("\n\t\tВывод списка найденных файлов в консоль:");
  97.         searchFiles(symbolForSearch, &numberOfFiles, catalogPath, outputFilePointer);
  98.         printf("\n\n\t\tОбщее кол-во найденных файлов: %d\n", numberOfFiles);
  99.  
  100.         fclose(outputFilePointer);
  101.         printf("\n\t\tЗапись в файл успешно завершена!\n");
  102.     }
  103.     else
  104.     {
  105.         printf("\nНе удалось открыть файл для записи! Повторите запуск программы");
  106.     }
  107.  
  108.     return 0;
  109. }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement