C/Visual C - Funcion S_ISDIR de stat no me funciona

   
Vista:

Funcion S_ISDIR de stat no me funciona

Publicado por Carlos Gomez (3 intervenciones) el 12/12/2015 17:03:14
Buenas! Estoy haiendo un programita que recorre un directorio archivo por archivo y el cual tiene que ignorar los directorios, pero cuando uso la funcion S_ISDIR la cual deberia retornar 0 si no es un directorios, me retorna 0 en todos los casos, directorios y no directorios.

Aqui les pongo el codigo de la funcion.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void procesarDirectorio()
{
   /* Con un puntero a DIR abro el directorio */
    DIR *dir;
    /* En *ent habrá información sobre el archivo que se está "sacando" a cada momento */
    struct dirent *ent;
    struct stat estru;
    char * pch;
    int comp,cont=0;
 
    /* Se empieza a leer en el directorio actual */
	dir = opendir (DIRECTORIO);
	printf("[OK] Verificando cambios en el directorio.\n");
	while ((ent = readdir (dir)) != NULL)
        {
		/* Descartar los directorios . y .. */
                if ( (strcmp(ent->d_name, ".")!=0) && (strcmp(ent->d_name, "..")!=0) )
	        {
			stat(ent->d_name, &estru);
			printf("%d",S_ISDIR(estru.st_mode));
			if (S_ISDIR(estru.st_mode)!=0){
				comp = subString(ent->d_name,".gz");
                        }
                 }
         }
}

Mucho supiera agradecer su ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Funcion S_ISDIR de stat no me funciona

Publicado por Tom (479 intervenciones) el 12/12/2015 17:15:18
S_ISDIR es una macro, no creo que nunca esté implementado como una función ...

Comprueba el valor de retorno de stat() (siempre hay que hacerlo), es lo que te está fallando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Funcion S_ISDIR de stat no me funciona

Publicado por Carlos Gomez (3 intervenciones) el 12/12/2015 17:23:41
Muchas gracias por responder! Coloque la siguientes comprobacion

1
2
if((stat(ent->d_name, &estru))==-1)
	        printf("Fallo el stat.");

Y efectivamente me esta fallando el stat y lo esta haciendo con cada archivo y directorios, que sera lo que pasa?

Y si, IS_DIR efectivamente es una macro-funcion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Funcion S_ISDIR de stat no me funciona

Publicado por Tom (479 intervenciones) el 12/12/2015 17:30:36
Es obvio.
Ya sabes, o eso parece porque lo estás comparando con "." y "..", que ent->d_name contiene un nombre _relativo_ al directorio que abriste con opendir() (es decir te da el nombre de un archivo contenido dentro de ese directorio, pero no su path).

Entonces, para abrir ese fichero necesitas un path completo, bien absoluto, o bien relativo a tu directorio de ejecución (getcwd()).

Hay varias formas de hacer que eso funcione. En mi opinión lo más sensato es que uses fstatat():

http://pubs.opengroup.org/onlinepubs/9699919799/functions/fstatat.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Funcion S_ISDIR de stat no me funciona

Publicado por Carlos Gomez (3 intervenciones) el 12/12/2015 18:16:54
Efectivamente era eso, comparto mi solucion por si alguien tiene el mismo problema:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char *obtenerRutaCompleta(struct dirent *ent)
{
  char *nombrecompleto;
  int tmp=8;
 
  nombrecompleto=malloc(tmp+strlen(ent->d_name)+2); /* Sumamos 2, por el \0 y la barra de directorios (/) */
  sprintf(nombrecompleto,"%s/%s", DIRECTORIO, ent->d_name);
 
  return nombrecompleto;
}
 
main:
 
char * rutacompleta;
 
rutacompleta = obtenerRutaCompleta(ent);
if((stat(rutacompleta, &estru))==-1)
   printf("Fallo el stat.");
free(rutacompleta);

Muchas gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Funcion S_ISDIR de stat no me funciona

Publicado por Tom (479 intervenciones) el 12/12/2015 19:25:00
Perfecto. De todos modos, echa un ojo a tu código original retocado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void procesarDirectorio(char *dirname) {
  /* Con un puntero a DIR abro el directorio */
  DIR *dir;
  /* En *ent habrá información sobre el archivo que se está "sacando" a cada momento */
  struct dirent *ent;
  struct stat estru;
  char * pch;
  int comp,cont=0;
 
  /* Se empieza a leer en el directorio actual */
  if(dir = opendir(dirname)) {
    printf("[OK] Verificando cambios en el directorio.\n");
 
    while(ent = readdir(dir)) {
      /* Descartar los directorios . y .. */
      if(strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..")) {
        //if(!stat(ent->d_name, &estru)) {
        if(!fstatat(dirfd(dir), ent->d_name, &estru, 0)) {
          //printf("%d", S_ISDIR(estru.st_mode));
 
          if(S_ISDIR(estru.st_mode)) {
            comp = subString(ent->d_name,".gz");
          }
        } else {
          perror(ent->d_name);
        }
      }
    }
    closedir(dir);
  } else {
    perror(dirname);
  }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Funcion S_ISDIR de stat no me funciona

Publicado por agustin (173 intervenciones) el 13/12/2015 09:30:15
Podrías poner el código completo? Faltan datos como la definición de las estructuras.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar