Как показать только те папки, в которых есть папки? - PullRequest
0 голосов
/ 07 мая 2020

Мне нужно вывести только те каталоги в текущей папке, в которых, как я уже упоминал, есть другие папки.

#define _DEFAULT_SOURCE ;
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
  char cwd[PATH_MAX];
  if (getcwd(cwd, sizeof(cwd)) != NULL)
   {
     struct dirent *pDirent; 
     DIR *pDir;
     pDir = opendir(cwd); 
     if(pDir != NULL)
     {
       struct stat sb; 
       struct dirent **folderArray; 
       folderArray = malloc(sizeof(struct stat)); 
       int foIndex = 0; 
      while ((pDirent = readdir(pDir)) != NULL) 
      {
        if(strcmp(pDirent->d_name, ".") != 0 
        && strcmp(pDirent->d_name, "..") != 0)
        {          
          stat(pDirent->d_name,&sb); 
          if((sb.st_mode & S_IFMT) == S_IFDIR)
          {      
           folderArray[foIndex++] = pDirent; 
           folderArray = realloc(folderArray, sizeof(struct stat)*(foIndex+1)); 
          }
        }     
      }   
  struct dirent *tDirent; 
  DIR *tDir;
  for(int i = 0; i<foIndex; ++i)
      { 
        tDir = opendir(folderArray[i]->d_name); 
        while ((tDirent = readdir(tDir)) != NULL) 
        {
          stat(tDirent->d_name,&sb); 
          if((sb.st_mode & S_IFMT) == S_IFDIR)
          {      
           printf("%s\n", folderArray[i]->d_name);
           break; 
          }
         closedir(tDir);
        }                
       }       
     closedir(pDir);
     free(pDirent);
     free(folderArray);
     }
   }
  return 0; 
}

Я придумал это решение, и теперь мне интересно, нужно ли было создавать новый массив или это можно сделать только в одном l oop? Потому что я не могу понять, храню ли я в этом массиве только тупиковые указатели или могу использовать его для открытия своих папок.

1 Ответ

0 голосов
/ 07 мая 2020

Вы можете избежать лишнего массива, но вам нужно будет объединить подкаталог l oop.

  while ((pDirent = readdir(pDir)) != NULL) 
  {
    if(strcmp(pDirent->d_name, ".") != 0 
    && strcmp(pDirent->d_name, "..") != 0)
    {          
      stat(pDirent->d_name,&sb); 
      if((sb.st_mode & S_IFMT) == S_IFDIR)
      {   

       /* Loop the sub directory */
       DIR *tDir = opendir(pDirent->d_name); 
       struct dirent *tDirent; 
       while ((tDirent = readdir(tDir)) != NULL) 
       {
         struct stat sb; 
         stat(tDirent->d_name,&sb); 
         if((sb.st_mode & S_IFMT) == S_IFDIR)
         {      
           printf("%s\n", tDirent->d_name);
           break; 
         }
       }  
       closedir(tDir);
      }
    }     
  }   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...