我一直在阅读Brian Kernighan和Dennis Ritchie – C编程语言,第8.6章是关于UNIX操作系统下的目录列表。 他们说,一切,甚至目录是一个文件。 这意味着我应该能够打开目录作为一个文件? 我试过使用stdio函数,它没有工作。 现在,我正在尝试使用UNIX系统function。 当然,我不使用UNIX,我使用的是Ubuntu Linux。 这是我的代码:
#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; }
即使当argn是1(没有参数),我试图读当前目录,这什么都不写。 任何想法/解释? 🙂
文件也被称为regular files
以区别于special files
。
目录或不是一个regular file
。 最常见的special file
是目录。 目录文件的布局由所使用的文件系统定义。
所以用opendir打开diretory。
尽管unix中的所有东西都是一个文件(目录也是),但是文件类型仍然是unix中的概念,并且适用于所有文件。 有常规文件,目录等文件类型,某些操作和功能允许/呈现每种文件类型。
在你的情况下,readdir适用于读取目录的内容。
如果你想看到目录中的文件,你必须使用opendir
和readdir
函数。
Nachiket的回答是正确的(确实是sujin),但是他们并没有清楚为什么要open
作品而不是read
。 出于好奇,我对给定的代码进行了一些更改,以确切了解到底发生了什么。
#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; }
编译和运行的结果如下:
file descriptor is 3 n = -1 read failure 21 cannot read: Is a directory
这解决了这个问题,虽然我预料会open
失败,因为打开目录的正确的系统函数是opendir()
。
K&R对于原始的UNIX是正确的。 我记得当UNIX文件系统的文件名长度限制为14个字符时,会将其恢复。 opendir(),readdir(),…东西是在更长的文件名变得普遍的时候发生的(大约在1990年左右)