Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/time.h>
- #include <dirent.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <string.h>
- #include <malloc.h>
- /* search func start */
- void searchFiles(const char searchingSymbol, int *numberOfFiles, const char *catalogPath, FILE *outputFilePointer)
- {
- DIR *dir;
- struct dirent *entry;
- dir = opendir(catalogPath);
- if (!dir) // попытка отрыть каталог
- {
- printf("\t\t\tОшибка при открытии %s!\n", catalogPath);
- return;
- };
- while ((entry = readdir(dir)) != NULL) // пока не кончатся файлы в каталоге
- {
- const char *slash = "/";
- char *fullPath = calloc(strlen(catalogPath) + strlen(slash) + strlen(entry->d_name), 1); // buff - после конкатенации становится полным путем к файлу, который
- // обнаружили с помощью if'a выше
- strcat(fullPath, catalogPath);
- strcat(fullPath, slash);
- strcat(fullPath, entry->d_name);
- if (entry->d_type == 4) // если тип файла - каталог
- {
- if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) // каталог не является текущим(.) или родительскиим(..)
- {
- searchFiles(searchingSymbol, numberOfFiles, fullPath, outputFilePointer);
- }
- }
- else // иначе - любой другой тип файла
- {
- if (entry->d_name[0] == searchingSymbol) // если равны первый символ названия файла и символ для поиска
- {
- FILE *filePointer;
- struct stat buff;
- if ((filePointer = fopen(fullPath, "rb")) == NULL)
- {
- printf("Не удалось прочитать данные о файле %s.\n", entry->d_name);
- }
- else
- {
- stat(fullPath, &buff);
- printf("\n\n\tНазвание: %s\n\tРазмер: %ld байт\n\tПолный путь: %s", entry->d_name, buff.st_size, fullPath);
- fprintf(outputFilePointer, "Название: %s\n\tРазмер: %ld байт\n\tПолный путь: %s\n\n", entry->d_name, buff.st_size, fullPath);
- fclose(filePointer);
- ++(*numberOfFiles);
- }
- }
- }
- };
- closedir(dir);
- }
- /* search func end */
- /* print procedures start */
- void printTaskInfo()
- {
- printf("\tДанная программа ищет в заданном каталоге и всех его подкаталогах все файлы,\n\t\tимена которых начинаются с заданного определенного символа.\n\t\t\tРезультаты выводятся на консоль и в указанный файл.\n\n");
- }
- /* print procedures end */
- int main(int argc, char *argv[], char *envp[])
- {
- const int NUM_OF_ARGS = 4;
- printTaskInfo();
- if (argc != NUM_OF_ARGS)
- {
- fprintf(stderr, "Неверный ввод!\nФормат ввода: %s <заданный каталог> <символ для поиска> <файл вывода>\n", argv[0]);
- printf("Повторите запуск программы!");
- return 1;
- }
- const char *catalogPath = argv[1];
- const char symbolForSearch = argv[2][0]; // берем первый символ второго аргумента для поиска
- const char *outputFilePath = argv[3];
- int numberOfFiles = 0;
- FILE *outputFilePointer = fopen(outputFilePath, "w");
- if (outputFilePointer)
- {
- printf("\n\t\tВывод списка найденных файлов в консоль:");
- searchFiles(symbolForSearch, &numberOfFiles, catalogPath, outputFilePointer);
- printf("\n\n\t\tОбщее кол-во найденных файлов: %d\n", numberOfFiles);
- fclose(outputFilePointer);
- printf("\n\t\tЗапись в файл успешно завершена!\n");
- }
- else
- {
- printf("\nНе удалось открыть файл для записи! Повторите запуск программы");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement