《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 程序设计语言》 第八章 malloc 函数实现于内测管理

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

Objective-C 程序设计 第八章

继承 就是父类和子类。根类和子类。 父类的非私有实例变量和方法都会成为新类定义的一部分。 在子类中使用父类的实例变量,父类必须先在接口部分声明。 父类在实现部分声明和合成的实例变量是私有的,子类中并不...
  • Xiemx
  • Xiemx
  • 2015-11-03 11:46
  • 278

[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第八章 继承

在子类使用实例变量,必须先在接口部分声明,在实现部分声明的实例变量是私有的 ClassB继承ClassA,ClassC继承ClassB. ClassC能继承ClassB的所有方法和实例变量,同时也一次...

Java语言程序设计基础篇 第八章 课后编程答案

import java.util.Scanner; public class ch0801{ public static void main( String[] args ){ Rectang...

《C语言程序设计教程》(主编黄迪明、余勤)第八章课后习题答案

第八章:位域、联合、枚举、定义类型及预处理功能。 掌握位域及结构嵌套,联合,枚举,定义类型名,预处理功能。

C 程序设计语言习题解答

  • 2008-10-07 10:57
  • 3.11MB
  • 下载

C 程序设计语言第二版

  • 2008-10-07 09:22
  • 7.25MB
  • 下载

Objective-C 2.0 学习笔记一(Objective-C 程序设计)

Objective-C 程序设计   变更履历 版本:v1.0 介绍 Objective-C 2.0 学习笔记将会是一个系列文章,主要用来记录笔者学习《Objective-C.2.0程序设计...

C 程序设计语言第2版

  • 2012-03-26 23:11
  • 6.34MB
  • 下载

C 程序设计语言

  • 2013-06-28 15:15
  • 4.29MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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