elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  sys/stat, stat() problema (?) [Lenguaje C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: sys/stat, stat() problema (?) [Lenguaje C]  (Leído 4,381 veces)
BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
sys/stat, stat() problema (?) [Lenguaje C]
« en: 25 Octubre 2012, 22:58 pm »

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:

Código
  1. // Includes de la shell
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <dirent.h>
  8. #include <sys/dir.h>
  9. #include <sys/stat.h>
  10. #include <sys/types.h>
  11. #include <errno.h>
  12. #define MAXENTRADA 2048
  13.  
  14. void deltree (char ** argv, int argc) {
  15.    struct dirent *ent;
  16.    struct stat fStat;
  17.    DIR *dir = opendir(argv[1]);
  18.    if(dir == NULL) {
  19.        perror("Hubo un error");
  20.    } else {
  21.        while ( (ent=readdir(dir)) != NULL ) {
  22.  
  23.            if(strcmp(".",ent->d_name) == 0 ||
  24.               strcmp("..",ent->d_name) == 0) continue;
  25.  
  26.            stat(ent->d_name, &fStat);
  27.  
  28.            if ( S_ISDIR(fStat.st_mode) )
  29.                puts(ent->d_name);
  30.  
  31.        }
  32.  
  33.        closedir(dir);
  34.        free(ent);
  35.        ent = NULL;
  36.  
  37.    }
  38. }
  39.  

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!


« Última modificación: 26 Octubre 2012, 15:46 pm por BatchianoISpyxolo » En línea

Puede que desees aprender a programar desde 0: www.espascal.es
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: sys/stat, stat() problema (?) [Lenguaje C]
« Respuesta #1 en: 26 Octubre 2012, 15:43 pm »

Nunca he visto un codigo en el que se le reserve memoria al puntero a dirent.


En línea

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

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: sys/stat, stat() problema (?) [Lenguaje C]
« Respuesta #2 en: 26 Octubre 2012, 15:47 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...
En línea

Puede que desees aprender a programar desde 0: www.espascal.es
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: sys/stat, stat() problema (?) [Lenguaje C]
« Respuesta #3 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.
En línea

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

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: sys/stat, stat() problema (?) [Lenguaje C]
« Respuesta #4 en: 26 Octubre 2012, 17:25 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
En línea

Puede que desees aprender a programar desde 0: www.espascal.es
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: sys/stat, stat() problema (?) [Lenguaje C]
« Respuesta #5 en: 27 Octubre 2012, 00:23 am »

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:

Código
  1. /*
  2.  * Función esDirectorio.
  3.  * Recibe como parámetro la ruta de un archivo.
  4.  * - Devuelve 0 si es un directorio, en caso contrario -1
  5. */
  6. int esDirectorio(char * file)
  7. {
  8. struct stat s;
  9.  
  10. if (stat(file, &s) == 0)
  11. return (S_ISDIR(s.st_mode) == 0);
  12. else
  13. return -1;
  14. }
  15.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con lenguaje de un programa
Ingeniería Inversa
sborin 2 2,303 Último mensaje 17 Abril 2006, 22:00 pm
por Revolutions
problema de lenguaje C
Programación C/C++
attackers 6 3,864 Último mensaje 15 Julio 2011, 17:32 pm
por rir3760
Presentando Stat de Personajes de Rakion -1th class tutorial de mi juego Latino
Foro Libre
Weeken 0 7,525 Último mensaje 30 Abril 2012, 05:31 am
por Weeken
Problema con Stat() en C
Programación C/C++
Borluck 5 2,766 Último mensaje 7 Mayo 2013, 17:23 pm
por leosansan
Como utilizar Struct stat
Programación C/C++
txiki481 1 2,404 Último mensaje 6 Mayo 2018, 16:59 pm
por srWhiteSkull
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines