#include #include #include #include #include #include #include #include #include #include /* 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; }