Найти и вывести все файлы имя которых начинается с указанной буквы - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д