Почему у меня есть два одинаковых массива при попытке разделить struct stat по файлам и папкам? - PullRequest
1 голос
/ 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>

void insertionSort(struct stat* myArray)
{
  for(int i = 0; i < sizeof(myArray)/sizeof(struct stat); ++i)
      {
        int j = i - 1;   
        while (j >= 0 && myArray[j].st_ctime > myArray[i].st_ctime)
         { 
            myArray[j + 1].st_ctime = myArray[j].st_ctime; 
            j = j - 1; 
        } 
        myArray[j + 1].st_ctime = myArray[i].st_ctime; 
      }
}

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 stat* fileArray;
       struct stat* folderArray;
       fileArray = malloc(sizeof(struct stat)); 
       folderArray = malloc(sizeof(struct stat));
       int fiIndex = 0, foIndex = 0; 
      while ((pDirent = readdir(pDir)) != NULL)
      {
        if(strcmp(pDirent->d_name, ".") != 0 
        && strcmp(pDirent->d_name, "..") != 0)
        {          
          stat(pDirent->d_name,&sb); 
//I suppose that the mistake is somewhere in this switch but I'm not really so sure         
           switch (sb.st_mode & S_IFMT) 
           {
           case S_IFDIR:
           folderArray[foIndex++] = sb; 
           folderArray = realloc(folderArray, sizeof(folderArray)+sizeof(struct stat));
           break; 
           case S_IFREG: 
           fileArray[fiIndex++] = sb; 
           folderArray = realloc(fileArray, sizeof(fileArray)+sizeof(struct stat));
           break;
           }
        }      
      }  
      insertionSort(fileArray);
      insertionSort(folderArray);
       for(int i = 0; i<sizeof(fileArray)/sizeof(stat); ++i)
      {
        rewinddir(pDir);
         while ((pDirent = readdir(pDir)) != NULL)
         {
            if(strcmp(pDirent->d_name, ".") != 0 
            && strcmp(pDirent->d_name, "..") != 0)
            {
              stat(pDirent->d_name,&sb);
              if(sb.st_ino == fileArray[i].st_ino)
              {
                printf("%s\n",pDirent->d_name);
              }
            }

         }
      }
     }
     closedir(pDir);
   }
  return 0; 
}

И еще у меня есть несколько вопросов, например, должен ли я вообще использовать переключатель? Есть ли более элегантный способ сравнения файлов или папок? То же самое и с печатью, я думаю, что сделал ее некрасивой: /

1 Ответ

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

folderArray = realloc(fileArray, ...

Конечно, это не то, что вы планировали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...