Найти и вывести все файлы имя которых начинается с указанной буквы - 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;
}

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

  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
Похожие ответы