sys/stat, stat() problema (?) [Lenguaje C]

Iniciado por BatchianoISpyxolo, 25 Octubre 2012, 22:58 PM

0 Miembros y 1 Visitante están viendo este tema.

BatchianoISpyxolo

Bueno, estoy creando una shell básica en C y trato de crear el comando deltree. Lo que quiero hacer es poder diferenciar entre archivos y directorios para que cuando sea un directorio, hacer una llamada recursiva a la propia función. La idea, como todos sabréis, es yo le paso una ruta, y la función me borra todo el árbol de archivos y directorios cuya raíz es la ruta que le paso. (En el código no verifiqué todavía el argc, pero ahí no está el problema, sino en la struct stat que creo que no se actualiza correctamente.

El código:


// Includes de la shell
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/dir.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#define MAXENTRADA 2048

void deltree (char ** argv, int argc) {
   struct dirent *ent;
   struct stat fStat;
   DIR *dir = opendir(argv[1]);
   if(dir == NULL) {
       perror("Hubo un error");
   } else {
       while ( (ent=readdir(dir)) != NULL ) {

           if(strcmp(".",ent->d_name) == 0 ||
              strcmp("..",ent->d_name) == 0) continue;

           stat(ent->d_name, &fStat);

           if ( S_ISDIR(fStat.st_mode) )
               puts(ent->d_name);

       }

       closedir(dir);
       free(ent);
       ent = NULL;

   }
}


el stat(ent->d_name, &fStat); devuelve -1 pero cuando hago un stat("dir/archivo_válido", &fStat); funciona correctamente. Es decir, que cuando le paso un "string" a stat, funciona correctamente pero cuando le paso el d_name del struct dirent, su salida es -1...

¿Alguna ayudita para poder solucionar el código?

¡Gracias de antemano!
Puede que desees aprender a programar desde 0: www.espascal.es

0xDani

Nunca he visto un codigo en el que se le reserve memoria al puntero a dirent.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

BatchianoISpyxolo

Cita de: 0xDani en 26 Octubre 2012, 15:43 PM
Nunca he visto un codigo en el que se le reserve memoria al puntero a dirent.

He hecho tantas pruebas y tantos cambios... El error está en el stat() que siempre me devuelve -1 cuando le paso el d_name de la entrada de directorio actual...
Puede que desees aprender a programar desde 0: www.espascal.es

0xDani

Pues ahora mismo no se cual es el error, pero si solo usas stat() para saber si es un directorio o un archivo, en la estructura dirent tambien hay un campo que te lo dice: d_type.

y aqui hay un ejemplo de la funcion stat(): http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

BatchianoISpyxolo

Cita de: 0xDani en 26 Octubre 2012, 16:02 PM
Pues ahora mismo no se cual es el error, pero si solo usas stat() para saber si es un directorio o un archivo, en la estructura dirent tambien hay un campo que te lo dice: d_type.

y aqui hay un ejemplo de la funcion stat(): http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html

Saludos.

Gracias por el d_type, se nota que no miré bien la struct dirent xD
Puede que desees aprender a programar desde 0: www.espascal.es

Khronos14

Jajaja debes de ser uno de la FIC con la práctica de Sistemas Operativos para el Domingo. Yo encontré toda la información necesaria aquí:

http://www.kernel.org/doc/man-pages/online/pages/man2/stat.2.html

La función esDirectorio, sería algo como esto:


/*
* Función esDirectorio.
* Recibe como parámetro la ruta de un archivo.
* - Devuelve 0 si es un directorio, en caso contrario -1
*/
int esDirectorio(char * file)
{
struct stat s;

if (stat(file, &s) == 0)
return (S_ISDIR(s.st_mode) == 0);
else
return -1;
}