He estado leyendo Brian Kernighan y Dennis Ritchie - El lenguaje de programación C y el capítulo 8.6 trata sobre la lista de directorios en UNIX OS. Dicen que todo e incluso el directorio es un archivo. ¿Esto significa que debería poder abrir el directorio como un archivo? Lo probé usando las funciones de stdio y no funcionó. Ahora, lo estoy probando con las funciones del sistema UNIX. Por supuesto, no estoy usando UNIX, estoy usando Ubuntu Linux. Aquí está mi código:
#include <syscall.h> #include <fcntl.h> int main(int argn, char* argv[]) { int fd; if (argn!=1) fd=open(argv[1],O_RDONLY,0); else fd=open(".",O_RDONLY,0); if (fd==-1) return -1; char buf[1024]; int n; while ((n=read(fd,buf,1024))>0) write(1,buf,n); close (fd); return 0; }
Esto no escribe nada incluso cuando argn es 1 (sin parámetros) y estoy tratando de leer el directorio actual. ¿Alguna idea/explicación? :)
Los archivos también se denominan regular files
para distinguirlos de special files
.
Directorio o no un regular file
. El special file
más común es el directorio. El diseño de un archivo de directorio está definido por el sistema de archivos utilizado.
Así que usa opendir para abrir el directorio.
La respuesta de Nachiket es correcta (como de hecho lo es sujin) pero no aclaran el misterio de por qué open
obras y no read
. Por curiosidad, hice algunos cambios en el código dado para averiguar exactamente qué estaba pasando.
#include <fcntl.h> #include <stdio.h> #include <errno.h> int main(int argc, char* argv[]) { int fd = -1; if (argc!=1) fd=open(argv[1],O_RDONLY,0); else fd=open(".",O_RDONLY,0); if (fd < 0){ perror("file open"); printf("error on open = %d", errno); return -1; } printf("file descriptor is %d\n", fd); char buf[1024]; int n; if ((n=read(fd,buf,1024))>0){ write(1,buf,n); } else { printf("n = %d\n", n); if (n < 0) { printf("read failure %d\n", errno); perror("cannot read"); } } close (fd); return 0; }
El resultado de compilar y ejecutar esto:
file descriptor is 3 n = -1 read failure 21 cannot read: Is a directory
Eso lo resuelve, aunque hubiera esperado que open
fallara, ya que la función correcta del sistema para abrir directorios es opendir()
.
Aunque todo en Unix es un archivo (también un directorio), el concepto de tipo de archivo está presente en Unix y se aplica a todos los archivos. hay tipos de archivos como archivos regulares, directorios, etc. y ciertas operaciones y funciones están permitidas/presentes para cada tipo de archivo.
En su caso, readdir es aplicable para leer el contenido del directorio.