Duda sobre programacion (tratamiento de ficheros y directorios)

Estoy echando un rato de programación... y me encuentro con un fragmento de código que no entiendo ni de coña.

Es este:

/* Formamos la ruta correspondiente al fichero de la entrada de
directorio que estamos procesando */

if (strcmp (dp->d_name, ".") && strcmp(dp->d_name, ".."))
{
sprintf(fichero, "%s/%s", dir, dp->d_name);
rdo = stat (fichero, &statbuf);

}



¿Que hace ese if?

A ver si alguno puede echarme una mano. salu2
SiC002 escribió:A ver si esto te sirve...

http://www.conclase.net/c/librerias/funcion.php?fun=strcmp


Gracias, la funcion strcmp la entiendo, pero de que me sirve, o para que se compara el nombre del fichero (d_name) con la cadena "." y con ".." ... como podriamos traducir eso al lenguaje natural?
Sabras que . es el directorio actual, y .. el directorio padre del actual, no?

Habria que ver algo mas del codigo, pero asi de entrada parece que esta mirando que en la string d_name de la estructura dp, haya . o .. y si lo hay, crea una string "algo/otroalgo", en el sprintf().


Puedes poner un pedazo mas, anterior a eso, o algo? XD
Pues tiene pinta de ser el típico bucle que recorre las entradas de un directorio (en este caso para hacer un stat sobre cada una), ignorando las entradas que se refieren al directoria actual y al directorio padre.
JanKusanagi escribió:Sabras que . es el directorio actual, y .. el directorio padre del actual, no?

Habria que ver algo mas del codigo, pero asi de entrada parece que esta mirando que en la string d_name de la estructura dp, haya . o .. y si lo hay, crea una string "algo/otroalgo", en el sprintf().


Puedes poner un pedazo mas, anterior a eso, o algo? XD



Vale, no sabia que para C . tb era el directorio actual y .. el padre.... ahora todo mas claro, ya entiendo el resto del código. Gracias y salu2
4eVaH escribió:Vale, no sabia que para C . tb era el directorio actual y .. el padre.... ahora todo mas claro, ya entiendo el resto del código.
No es que sea "para C", es para cualquier funcion que se entienda con el sistema de archivos... igual que "/" sera "/" o "/home" sera "/home", pues "." es el directorio actual, etc XD
/* Formamos la ruta correspondiente al fichero de la entrada de
directorio que estamos procesando */

if (strcmp (dp->d_name, ".") && strcmp(dp->d_name, ".."))
{
sprintf(fichero, "%s/%s", dir, dp->d_name);
rdo = stat (fichero, &statbuf);

}


Lo que hace ese if ya te lo han contado... lo que si es cierto es que quien haya escrito eso no sabe muy bien qué está haciendo... y es una pena. Hay una posibilidad de desbordar el buffer 'fichero' y eso es malo :)

¿ De dónde lo has sacado ?

- ferdy
Ferdy escribió:
/* Formamos la ruta correspondiente al fichero de la entrada de
directorio que estamos procesando */

if (strcmp (dp->d_name, ".") && strcmp(dp->d_name, ".."))
{
sprintf(fichero, "%s/%s", dir, dp->d_name);
rdo = stat (fichero, &statbuf);

}


Lo que hace ese if ya te lo han contado... lo que si es cierto es que quien haya escrito eso no sabe muy bien qué está haciendo... y es una pena. Hay una posibilidad de desbordar el buffer 'fichero' y eso es malo :)

¿ De dónde lo has sacado ?

- ferdy


Es la solución a un examen de Laboratorio de sistemas operativos (Programación C en Unix) de la titulación de Ingeniería informática de la universidad de sevilla... asi está el patio parece ser...

Gracias a todos.

PD: Ferdy, te puedo mandar los examenes si quieres echarles un ojo, aunque no se si te interesará mucho.
Es la solución a un examen de Laboratorio de sistemas operativos (Programación C en Unix) de la titulación de Ingeniería informática de la universidad de sevilla... asi está el patio parece ser...


Entonces, si te interesan estas cosas, intenta aprenderlas en otro sitio...

PD: Ferdy, te puedo mandar los examenes si quieres echarles un ojo, aunque no se si te interesará mucho.


Muchas gracias, pero en principio no me interesa :)

- ferdy
Son las 5:35 de la mañana... y acabo de llegar un poco "tocado" por el amigo etanol así que esta pregunta es posible que quede para linchamiento público, pero...

if (strcmp (dp->d_name, ".") && strcmp(dp->d_name, ".."))

¿Cómo podría ser 'dp->d_name' igual a '.' y '..' al mismo tiempo?

Ya digo... mañana cuando me levante me lo replanteo, pero bueno, os lo dejo para reírse un rato.

¡Talué!
Cobo escribió:Son las 5:35 de la mañana... y acabo de llegar un poco "tocado" por el amigo etanol así que esta pregunta es posible que quede para linchamiento público, pero...


if (strcmp (dp->d_name, ".") && strcmp(dp->d_name, ".."))


¿Cómo podría ser 'dp->d_name' igual a '.' y '..' al mismo tiempo?

Ya digo... mañana cuando me levante me lo replanteo, pero bueno, os lo dejo para reírse un rato.

¡Talué!

No, la condición es que tanto strcmp(dp->d_name, ".") como strcmp(dp->d_name, "..") devuelvan un valor distinto de 0, es decir, que no haya encuentro alguno en las comparaciones.
11 respuestas