@Vinill80s

Как сделать вывод всех файлов файлов и директорий с данными о каждом файле?

Необходимо вывести все директории и файлы по указанному пути рекурсией + к каждому файлу вывести информацию, типа дата создания/изменения, вес (в общем, общие свойства).
На данный момент написан рекурсивный вывод файлов + вывод веса. Но не работает, если в пути есть пробел, например, c:\Program Files (пытался экранировать, писать \\, но ничего не получилось) и если нужно вывести по маске, например, c:\*.txt. Также не получается вывести что-то кроме веса файла.
Использую компилятор MinGW.
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include "iostream"
#include "string"
#include <windows.h>
#include <fstream>
using namespace std;
void listFilesRecursively(char *path);
int main()
{
  setlocale(LC_ALL , "Russian");
    char path[100];
    printf("Enter path to list files: ");
    scanf("%s", path);
    listFilesRecursively(path);
    return 0;
}
void listFilesRecursively(char *basePath)
{
     WIN32_FILE_ATTRIBUTE_DATA Info;
     char path[1000];
     struct dirent *dp;
     DIR *dir = opendir(basePath);
    if (!dir)
        return;
    while ((dp = readdir(dir)) != NULL)
    {
        if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0)
        {
            printf("%s\n", dp->d_name);
 
            strcpy(path, basePath);
            strcat(path, "/");
            strcat(path, dp->d_name);
            
            string path_s = (const char*) path;
            GetFileAttributesEx(path_s.c_str(), GetFileExInfoStandard, &Info);
            cout<<Info.nFileSizeLow<<endl;
            listFilesRecursively(path);
        }
    }
 
    closedir(dir);
}
  • Вопрос задан
  • 601 просмотр
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
Заготовка

#include<iostream>
#include<filesystem>
#include<string>

using namespace std;
namespace fs = filesystem;

auto listFilesRecursively = [](auto const& dir, string const& mask = {}){
  if(!fs::is_directory(dir))
  {
    cerr << dir << " is not dir";
    throw "is not dir!";
  }
  
  for(auto const& file : fs::recursive_directory_iterator(dir))
  {
    if(fs::is_regular_file(file))
    {
      if(mask.empty() || file.path().extension().string() == mask)
      {
        // Здесь твоя функция вывода инфы
        cout << file.path().string() << " #size: " << file.file_size() << "\n";
      }
    }
    else if(fs::is_directory(file))
    {
      cout << "\n****** dir ****** [" << file.path().string() << "]\n";
    }
    else
    {
      cout << "\n***** other... ******[" << file.path().filename().string() << "]\n";
    }
  }
};

int main()
{
  const string start_dir = R"(C:\Program Files)";
  try
  {
    listFilesRecursively(start_dir, ".dll");
  }
  catch(exception& e)
  {
    cerr << e.what();
  }
}


если нужна прямо маска - маска, то тут уже сам, там конечный автомат на 10-15 строк.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы