《C 程序设计语言》 第八章 fsize 读取文件夹内容例子的讨论

原创 2016年08月30日 23:05:49

阅读“C程序设计语言”第八章有一个例子,在UNIX系统中自己实现文件夹内容的读取等各种操作。

其中有一个函数readdir 中 利用了open 和read函数来读取文件夹,可是我在Centos7 上总是到失败。

查看stackoverflow上有类似的讨论

http://stackoverflow.com/questions/21405048/linux-open-directory-as-a-file


作者做了这个实验,open是可以打开文件夹但是不能调用读取read,总是返回-1

#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

最佳解释如下



1down voteaccepted

Files are also called regular files to distinguish them from special files.

Directory or not a regular file. The most common special file is the directory. The layout of a directory file is defined by the filesystem used.

So use opendir to open diretory.



文件分为 普通文件  和特殊文件。 而Directory可以是普通文件也可以不是。取决于具体的文件系统。 所以才会定义一套通用的接口 opendir  readdir  和closedir

而自己去实现readdir的话设计到具体的文件系统。所以就不深入讨论了。





1down voteaccepted

Files are also called regular files to distinguish them from special files.

Directory or not a regular file. The most common special file is the directory. The layout of a directory file is defined by the filesystem used.

So use opendir to open diretory.


一个UNIX系统下的使用opendir readdir closedir的例子

#include<stdio.h>
#include<dirent.h>
 
int main(int argc,char* agrv[]){
DIR* dp;
struct dirent* dirp;
 
if(argc!=2){
  printf("usage:lsdirectory_name\n");
  //不返回的话,程序会执行出错
  return 0;
}
if((dp=opendir(agrv[1]))==NULL){
  printf("cannotopen%s",agrv[1]);
  //不返回的话,程序会执行出错
  return 0;
}
while((dirp=readdir(dp))!=NULL){
  printf("%s\n",dirp->d_name);
}
closedir(dp);
//c语言以非0为真,所以程序执行成功的话返回1,执行失败返回0
return 1;
}




 



文件分为 普通文件  和特殊文件。 而Directory可以是普通文件也可以不是。取决于具体的文件系统。 所以才会定义一套通用的接口 opendir  readdir  和closedir

而自己去实现readdir的话设计到具体的文件系统。所以就不深入讨论了。


1down voteaccepted

Files are also called regular files to distinguish them from special files.

Directory or not a regular file. The most common special file is the directory. The layout of a directory file is defined by the filesystem used.

So use opendir to open diretory.

C程序设计语言(第二版)-读书笔记

The C Programming Language 1. 设计一个程序,作用为无限字符输出: int c; printf(“Please in put the char …\n”); //g...
  • conanswp
  • conanswp
  • 2016年12月08日 22:02
  • 678

读经典《C程序设计语言》(The C Programming Language)

作为软工专业的学生,大三下,我重新开始学习C语言,为什么呢?因为我发现在大学生涯里,我花了很多时间去刷GPA,花了很多时间去做了很多无谓的事情,以至于马上就面临找实习、找工作。自己甚至连一门语言都没有...
  • stc_XC
  • stc_XC
  • 2017年05月30日 22:54
  • 957

《C程序设计语言》学习笔记——练习3-1

计时的结果,都是0.000000...... /* 练习3-1 在上面有关二分查找的例子中,在while循环语句内共作了两次测试,其实只要一次就够了(以把更多的测试放在外面为代价)。重写 这个函数,...
  • fiveyes
  • fiveyes
  • 2015年08月08日 20:48
  • 324

C程序设计语言笔记

本文主要记录C语言“圣经”——《C程序设计语言》
  • lincoln_2012
  • lincoln_2012
  • 2014年07月10日 17:15
  • 1129

《C 程序设计语言》 第八章 malloc 函数实现于内测管理

这章举例实现了一个内存管理函数malloc 将系统以来的部分和非系统依赖的部分进行分离 malloc内部管理的内存区块实际上是一个环链表,用一个全局指针纪录上一次操作的节点,用户遍历时判断是否已经...
  • sesiria
  • sesiria
  • 2016年09月10日 10:36
  • 290

C语言读取指定文件夹下面的所有文件

#include #include int main(int argc, char *argv[]) { struct _finddata_t fa; long fHandle; if( ...
  • fengyunzhongwei
  • fengyunzhongwei
  • 2014年08月11日 11:02
  • 4364

C Primer Plus(第6版)第八章答案

1.#include int main (void) { int ch;//字符 int i = 0;//字符数 while ((ch = getchar ()) != ...
  • sirius_black_tea
  • sirius_black_tea
  • 2017年07月21日 15:00
  • 394

C程序设计语言(第2版)

C程序设计语言(第2版) 这儿有一篇写的很好的读后感:http://www.cnblogs.com/xkfz007/articles/2566424.html   第1章 导言 ...
  • benpaobagzb
  • benpaobagzb
  • 2015年09月14日 17:41
  • 1052

关于缓冲区,如果c primer plus 第八章看不懂就先看这个!!!!!

c语言输入输出缓冲区的概念(一)(说的非常好,转载自网上) 你肯定会奇怪为什么一开始先说这个,一开始不都是数据类型什么的嘛,这个写在最前面因为后面的程序即使最简单的code都会用到输入输出,输出比较...
  • whieet
  • whieet
  • 2012年09月01日 09:30
  • 1937

C程序设计语言——例子1.13

#include #define LENGTH 10  /*规定,输出为直方图的单词数只能为LENGTH个*/ #define OUT 0 /*输入非字母时候的状态*/ #define IN ...
  • l317118524
  • l317118524
  • 2017年03月18日 11:00
  • 277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《C 程序设计语言》 第八章 fsize 读取文件夹内容例子的讨论
举报原因:
原因补充:

(最多只允许输入30个字)