Найти и вывести все файлы имя которых начинается с указанной буквы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Помогите с лабой пож-та. Дан только этот код. Как я понимаю эта программа рекурсивно ищет конкретный файл по названию во всех подпапках. Мне же нужно: Найти и вывести все файлы (со всех подпапок) имя которых начинается с указанной буквы.
Листинг программы
  1. #include <cstdlib>
  2. #include <iostream>
  3. using namespace std;
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <dirent.h>
  7.  
  8. void PrintFileLocations(char const*StartDir, char const*FileName);
  9. int main(int argc, char *argv[])
  10. {
  11. char fname[256]="1.txt", dirname[256]="D:\\Home";
  12. PrintFileLocations(dirname, fname);
  13. system("PAUSE");
  14. return EXIT_SUCCESS;
  15. }
  16. void PrintFileLocations(char const*StartDir, char const*FileName)
  17. {
  18. DIR *dp = opendir (StartDir);
  19. // Граничное условие: если StartDir это не папка,
  20. // то нет в ней файлов с именем FileName
  21. if (dp == NULL)
  22. {
  23. return ;
  24. }
  25. else
  26. {
  27. struct dirent *ep;
  28. while (ep = readdir (dp))
  29. {
  30. if( strcmp(ep->d_name, "." ) ==0 || strcmp(ep->d_name, ".." ) ==0)
  31. continue;
  32. // Проверяем каждый элемент из папки и , если его имя
  33. // совпало с FileName - выводим путь и увеличиваем счётчик
  34. if(strcmp(FileName, ep->d_name)==0)
  35. {
  36. printf("%s\\%s\n", StartDir, ep->d_name);
  37. }
  38. // Рекурсивно ищем, предполагая, что данный элемент является папкой
  39. char *newDir=(char*)
  40. malloc(sizeof(char)*(strlen(StartDir)+strlen(ep->d_name)+2));
  41. strcpy(newDir, StartDir);
  42. strcat(newDir, "\\");
  43. strcat(newDir, ep->d_name);
  44. PrintFileLocations(newDir, FileName);
  45. free(newDir);
  46. }
  47. closedir (dp);
  48. }
  49. }

Решение задачи: «Найти и вывести все файлы имя которых начинается с указанной буквы»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dirent.h>
  5. #include <sys/stat.h>
  6.  
  7. void PrintFileLocations(char const* dirname, char ch)
  8. {
  9.    DIR* dir = opendir(dirname);
  10.  
  11.    // Если директория не может быть открыта
  12.    // констатируем ошибку
  13.    if (dir == NULL)
  14.    {
  15.       perror(dirname);
  16.       return;
  17.    }
  18.  
  19.    // Для хранения полного имени файла
  20.    char filename[MAX_PATH];
  21.  
  22.    // Для хранения основной информации о файле
  23.    struct dirent* path;
  24.    // Для хранения дополнительной информации о файле
  25.    struct stat info;
  26.    // Перебираем все файлы в заданной директории
  27.    while ((path = readdir(dir)) != NULL)
  28.    {
  29.       // Отсеиваем лишнее
  30.       if (strcmp(path->d_name, ".") == 0 || strcmp(path->d_name, "..") == 0)
  31.       {
  32.          continue;
  33.       }
  34.       // Формируем полное имя файла: директория + имя файла
  35.       sprintf(filename, "%s\\%s", dirname, path->d_name);
  36.  
  37.       // Считываем дополнительные атрибуты файла
  38.       stat(filename, &info);
  39.  
  40.       // Если данный файл является директорией
  41.       if(S_ISDIR(info.st_mode))
  42.       {
  43.          // Вызываем нашу функцию для этой директории
  44.          PrintFileLocations(filename, ch);
  45.       }
  46.       // Если имя файла начинается с заданной буквы
  47.       else if (*path->d_name == ch)
  48.       {
  49.          printf("%s\n", filename);
  50.       }
  51.    }
  52.    closedir(dir);
  53. }
  54.  
  55. int main(int argc, char* argv[])
  56. {
  57.    PrintFileLocations(".", 'a');
  58.    system("pause");
  59.    return EXIT_SUCCESS;
  60. }

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с директориями и файлами
  2. Определяем функцию PrintFileLocations, которая принимает полный путь к директории и символ, с которого начинаются имена файлов, и использует opendir для открытия директории
  3. Если директория не может быть открыта, выводим сообщение об ошибке и возвращаем управление
  4. Создаем массив для хранения полного имени файла
  5. Создаем структуру dirent для хранения информации о файле
  6. Создаем структуру stat для хранения информации о файле
  7. В цикле while с помощью readdir перебираем все файлы в директории
  8. Если текущий файл является . или .., пропускаем его
  9. Формируем полное имя файла путем конкатенации пути к директории и имени файла
  10. Считываем информацию о файле с помощью stat
  11. Если текущий файл является директорией, вызываем рекурсивно функцию PrintFileLocations для этой директории
  12. Если имя файла начинается с заданной буквы, выводим его полное имя
  13. Закрываем директорию с помощью closedir
  14. В функции main вызываем PrintFileLocations для текущей директории с символом 'a'
  15. Используем system для приостановки выполнения программы до нажатия клавиши
  16. Возвращаем EXIT_SUCCESS

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.455 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы