Scansione file e relativa size

di il
1 risposte

Scansione file e relativa size

Questa funzione dovrebbe controllare tutti i file a partire da un path e stampare nome del path e la relativa size.
Sto facendo un piccolo test, con una cartella DIR contenente file1.txt, file2.txt e una cartella SUB-DIR contenente a sua volta file3.txt e img1.bmp.
Se controllo la cartella DIR funziona tutto bene, tranne per il fatto che per calcolare la size di SUB-DIR dovrò ricorsivamente calcolare la somma delle size di tutti i file e sotto directory.
Ma il mio problema è che se chiamo la funzione su DIR\SUB-DIR, il path con il trattino non me lo da buono, togliendolo si.
Qualche consiglio?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <windows.h>
#include <sys/stat.h>
#include <unistd.h>


int scan_no_recursive_path(char *path)
{
  struct dirent* in_file;
  DIR *fd;
  
  printf("=== PATH = %s ===\n",path);

  fd = opendir(path);
  if( fd == NULL )
    {
      perror("File not found");
      return -1;
    }

  while( in_file = readdir(fd) )
    {
      if (!strcmp (in_file->d_name, "."))
	continue;
      if (!strcmp (in_file->d_name, ".."))
	continue;

      printf("\n    File\n");


      int length = strlen(in_file->d_name);
      char *name = malloc(sizeof(char)*(length+2+strlen(path)));

      memset(name,0,strlen(name));
      
      strncpy(name, path, strlen(path));
      strcat(name, "\\");
      strncat(name, in_file->d_name, length);

      struct stat buf;

      if ( stat(name,&buf) < 0 )
	{
	  perror("Error: ");
	  return -1;
	};
      
      printf("Path = %s, Size = %d bytes\n",name, buf.st_size);

    }

  closedir(fd);
  
  return 0;
}


int main()
{

  return scan_no_recursive_path("DIR\\SUB-DIR");
}

1 Risposte

  • Re: Scansione file e relativa size

    Ho risolto sbagliavo l'allocazione della memoria e la pulizia del buffer.
    Se qualcuno potrebbe comunque darci un'occhiata accetto qualsiasi consiglio.
    
    int scan_path(char *path)
    {
      struct dirent* in_file;
      DIR *fd;
      
      printf("=== PATH = %s ===\n",path);
    
      fd = opendir(path);
      if( fd == NULL )
        {
          perror("File not found");
          return -1;
        }
    
      while( in_file = readdir(fd) )
        {
          
          if (!strcmp (in_file->d_name, "."))
    	continue;
          if (!strcmp (in_file->d_name, ".."))
    	continue;
    
    
          int length = strlen(in_file->d_name)+strlen(path)+2;
          char *name = malloc(sizeof(char)*length);
    
          memset(name, '\0', length);
          
          strncpy(name, path, strlen(path));
          strncat(name, "\\", 1);
          strncat(name, in_file->d_name, strlen(in_file->d_name));
    
          
          struct stat buf;
          int f=1;
    
          if( stat(name,&buf) < 0 )
    	{
    	  perror("Error: stat");
    	  return -1;
    	};
    
          if( S_ISDIR(buf.st_mode) )
    	{
    	  printf("\n");
    	  scan_path(name);
    	  f=!f;
    	}
    
          if(f) printf("Path = %s, Size = %d bytes\n",name, buf.st_size);
    
          free(name);
        }
    
      closedir(fd);
      
      return 0;
    }
    
    
    int main()
    {
    
      return scan_path("DIR");
    }
    
    
Devi accedere o registrarti per scrivere nel forum
1 risposte