Найти и вывести все файлы имя которых начинается с указанной буквы - C (СИ)
Формулировка задачи:
Доброго времени суток.
Помогите с лабой пож-та. Дан только этот код. Как я понимаю эта программа рекурсивно ищет конкретный файл по названию во всех подпапках. Мне же нужно: Найти и вывести все файлы (со всех подпапок) имя которых начинается с указанной буквы.
#include <cstdlib> #include <iostream> using namespace std; #include <stdio.h> #include <stdlib.h> #include <dirent.h> void PrintFileLocations(char const*StartDir, char const*FileName); int main(int argc, char *argv[]) { char fname[256]="1.txt", dirname[256]="D:\\Home"; PrintFileLocations(dirname, fname); system("PAUSE"); return EXIT_SUCCESS; } void PrintFileLocations(char const*StartDir, char const*FileName) { DIR *dp = opendir (StartDir); // Граничное условие: если StartDir это не папка, // то нет в ней файлов с именем FileName if (dp == NULL) { return ; } else { struct dirent *ep; while (ep = readdir (dp)) { if( strcmp(ep->d_name, "." ) ==0 || strcmp(ep->d_name, ".." ) ==0) continue; // Проверяем каждый элемент из папки и , если его имя // совпало с FileName - выводим путь и увеличиваем счётчик if(strcmp(FileName, ep->d_name)==0) { printf("%s\\%s\n", StartDir, ep->d_name); } // Рекурсивно ищем, предполагая, что данный элемент является папкой char *newDir=(char*) malloc(sizeof(char)*(strlen(StartDir)+strlen(ep->d_name)+2)); strcpy(newDir, StartDir); strcat(newDir, "\\"); strcat(newDir, ep->d_name); PrintFileLocations(newDir, FileName); free(newDir); } closedir (dp); } }
Решение задачи: «Найти и вывести все файлы имя которых начинается с указанной буквы»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <sys/stat.h> void PrintFileLocations(char const* dirname, char ch) { DIR* dir = opendir(dirname); // Если директория не может быть открыта // констатируем ошибку if (dir == NULL) { perror(dirname); return; } // Для хранения полного имени файла char filename[MAX_PATH]; // Для хранения основной информации о файле struct dirent* path; // Для хранения дополнительной информации о файле struct stat info; // Перебираем все файлы в заданной директории while ((path = readdir(dir)) != NULL) { // Отсеиваем лишнее if (strcmp(path->d_name, ".") == 0 || strcmp(path->d_name, "..") == 0) { continue; } // Формируем полное имя файла: директория + имя файла sprintf(filename, "%s\\%s", dirname, path->d_name); // Считываем дополнительные атрибуты файла stat(filename, &info); // Если данный файл является директорией if(S_ISDIR(info.st_mode)) { // Вызываем нашу функцию для этой директории PrintFileLocations(filename, ch); } // Если имя файла начинается с заданной буквы else if (*path->d_name == ch) { printf("%s\n", filename); } } closedir(dir); } int main(int argc, char* argv[]) { PrintFileLocations(".", 'a'); system("pause"); return EXIT_SUCCESS; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с директориями и файлами
- Определяем функцию PrintFileLocations, которая принимает полный путь к директории и символ, с которого начинаются имена файлов, и использует opendir для открытия директории
- Если директория не может быть открыта, выводим сообщение об ошибке и возвращаем управление
- Создаем массив для хранения полного имени файла
- Создаем структуру dirent для хранения информации о файле
- Создаем структуру stat для хранения информации о файле
- В цикле while с помощью readdir перебираем все файлы в директории
- Если текущий файл является . или .., пропускаем его
- Формируем полное имя файла путем конкатенации пути к директории и имени файла
- Считываем информацию о файле с помощью stat
- Если текущий файл является директорией, вызываем рекурсивно функцию PrintFileLocations для этой директории
- Если имя файла начинается с заданной буквы, выводим его полное имя
- Закрываем директорию с помощью closedir
- В функции main вызываем PrintFileLocations для текущей директории с символом 'a'
- Используем system для приостановки выполнения программы до нажатия клавиши
- Возвращаем EXIT_SUCCESS
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д