Sie sind auf Seite 1von 4

ACCESO A DIRECTORIOS

Varias son las llamadas al sistema que se requieren para acceder al contenido de los directorios. Para abrir un directorio necesitamos usar la llamada al sistema opendir(). opendir() presenta el siguiente prototipo: #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *pathname); La llamada a opendir() abre el directorio especificado y retorna un puntero a dicho directorio en caso de xito o retorna NULL en caso de error. Este puntero al directorio es utilizado por las llamadas al sistema readdir(), en el caso que deseemos leer el directorio, y closedir(), en el caso que deseemos cerrar el directorio. La llamada al sistema closedir() cierra un directorio previamente abierto con opendir() y presenta el siguiente prototipo: #include <sys/types.h> #include <dirent.h> int closedir(DIR *dirptr); La llamada al sistema closedir() devuelve 0 si tiene xito o -1 si falla. La llamada al sistema readdir() tiene el prototipo: #include <dirent.h> struct dirent *readdir(DIR *dirptr); Esta llamada retorna un puntero a una estructura dirent que representa la siguiente entrada de directorios en el flujo de directorio al que apunte dirptr. Devuelve NULL cuando alcanza el fin_de_archivo o si hay un error. Llamando repetidamente a readdir() resultar en una lectura secuencial del contenido del directorio especificado. La estructura dirent se define como sigue: struct dirent{ long d_ino; /* nmero de i-nodo */ off_t d_off; /* desplazamiento al siguiente dirent */

unsigned short d_reclen; /* longitud de este registro */ unsigned char d_type; /* tipo de archivo */ char d_name[256]; /* nombre del directorio */ }; El siguiente ejemplo lista todos los archivos del directorio /home/jaime: #include <stdio.h> #include <sys/types.h> #include <dirent.h> main(){ DIR *dirptr; struct dirent *buf; //Abrir el directorio /home/jaime dirptr=opendir(/home/jaime); //Leer secuencialmente el directorio /home/jaime while((buf=readdir(dirptr))!=0){ printf(%s\n,buf->d_name); } //Cerrar el directorio /home/jaime closedir(dirptr); }

I-NODOS Un directorio est compuesto de una serie de estructuras; cada estructura contiene el nombre de un archivo y un puntero al archivo mismo. Este puntero es un entero llamado i-number (index number) del archivo. Cuando el archivo es accesado, su i-number es usado como un ndice en la tabla del sistema i-list, en donde, la entrada para el archivo, i-node, es almacenada. Un archivo en los Sistemas UNIX/LINUX se describe mediante un objeto denominado "i-nodo". Por cada archivo existe un i-nodo nico

que lo describe y que contiene punteros a los bloques que comprende dicho archivo. El i-nodo contiene informacin sobre los derechos de acceso (permisos) al archivo, el nmero de enlaces, fecha de creacin, fecha de modificacin, identificacin del dueo, un indicador del tipo de archivo y alguna otra informacin. Sin lugar a duda que la informacin ms importante de un i-nodo se refiere a los nmeros de bloque referidos a los bloques fsicos (o de disco) que contienen los datos del archivo. El sistema mantiene una i-list separada para cada rbol de directorio montado; as, es posible para varios archivos en el sistema de archivos tener el mismo i-number. Toda la informacin del i-nodo de un archivo es copiada en una estructura denominada stat, que se encuentra definida en <sys/stat.h>: struct stat{ dev_t st_dev; /* dispositivo */ ino_t st_ino; /* i-nodo */ mode_t st_mode /* proteccin */ ... }; La informacin de esta estructura puede ser recuperada usando la llamada al sistema stat(). La llamada al sistema stat() presenta el siguiente prototipo: #include <sys/stat.h> #include <unistd.h> int stat(const char *pathname, struct stat *buf); Para stat(), el primer parmetro es el pathname al archivo y buf es un puntero a la estructura stat la cual ser llenada con la informacin de estado apropiada; stat() examina el archivo al que apunta patname y entonces llena buf. La llamada al sistema stat() retorna 0 en caso de completarse satisfactoriamente la estructura, -1 en caso de error. El siguiente ejemplo permite obtener la informacin del archivo /home/jaime/prueba:

#include <stdio.h> #include <sys/stat.h> #include <unistd.h> main(){ struct stat buf; //Obtener informacin del archivo prueba stat(/home/jaime/prueba,&buf); printf(%s\t%d\t%d\n,home/jaime/prueba,buf.st_ino,buf.st_ size); }

Bibliografia Linux A-Z, Phil Cornes, Prentice-Hall, 1997.

Das könnte Ihnen auch gefallen