zoukankan      html  css  js  c++  java
  • UNIXLINUX编程实践教程>第三章>实例代码注解>ls1

    一 问题

      实现ls的功能

    二 分析

      1 在linux中,要查看文件夹中有什么内容,可以使用readdir函数直接读该文件夹的内容,并以结构体dirent保存该内容
      2 文件夹中有两个特殊文件"."和"..",表示当前文件夹和上一文件夹
      3 "ls"表明读取当前文件夹,"ls filename"表示读取指定文件夹,"ls filename1 filename2"表示读取多个指定文件夹

    三 实现(以读取当前文件夹为例)

    1 打开该文件夹

    # include<stdio.h>
    # include<sys/types.h>
    # include<dirent.h>
    
    main(int ac,char *av[])
    {
        DIR *dir_ptr;//文件夹指针
        /* 打开该文件夹 */
        if((dir_ptr = opendir(".")) == NULL)
        {
        /* 打开失败 报告异常 */
            fprintf(stderr,"ls1:cannot open %s\n",dirname);
        }
        else
        {
        /* 打开成功 */
            
        }
    }

    2 读取该文件夹的目录信息并显示文件名

    # include<stdio.h>
    # include<sys/types.h>
    # include<dirent.h>
    
    main(int ac,char *av[])
    {
        DIR *dir_ptr;/* 文件夹指针 */
        struct dirent *direntp;/* 存放文件夹目录内容的结构体 */
        /* 打开该文件夹 */
        if((dir_ptr = opendir(".")) == NULL)
        {
        /* 打开失败 报告异常 */
            fprintf(stderr,"ls1:cannot open %s\n",dirname);
        }
        else
        {
        /* 打开成功 */
            /*读取该文件夹目录信息并显示文件名*/
            while((direntp = readdir(dir_ptr)) != NULL)
            {
                printf("%s\n",direntp->d_name);
            }
            closedir(dir_ptr);
        }
    }    

    四 整合并引入“读取多个文件夹”

    /** ls1.c
     ** purpose list contents of directory or directories
     ** action if no args,use.else list files in args
     **/
    # include<stdio.h>
    # include<sys/types.h>
    # include<dirent.h>
    
    void do_ls(char[]);
    
    main(int ac,char *av[])
    {
        if( ac==1 )
        {
            /*查看当前目录*/
            do_ls(".");
        }
        else
        {
            /*查看指定的一个或多个目录*/
            while( --ac )
            {
                printf("%s:\n",*++av);
                do_ls( *av );
            }
        }
    }
    
    /*
     * list files in directory called dirname
     */
    void do_ls( char dirname[] )
    {
        DIR *dir_ptr;    /* the directory */
        struct dirent *direntp; /* each entry */
        /*打开文件夹*/
        if((dir_ptr = opendir(dirname)) == NULL)
        {
            fprintf(stderr,"ls1:cannot open %s\n",dirname);
        }
        else
        {
            //顺序读取文件信息结构体
            while((direntp = readdir(dir_ptr)) != NULL)
            {
                //输出文件名
                printf("%s\n",direntp->d_name);
            }
            //关闭文件夹
            closedir(dir_ptr);
        }
    }

    五 相关函数与结构体

    1 opendir
    打开一个目录,失败时返回一个空指针
    头文件:#inculde<dirent.h>
    函数原型 DIR* opendir (const char * path );
    参数    path 目录的路径
    返回值   DIR* 一个用来保存目录信息结构体指针
          NULL 打开失败

    2 readdir
    读取目录,然后返回dirent结构体指针
    头文件:#include<dirent.h>
    函数原型 struct dirent* readdir(DIR* dir_handle);
    参数 dir_handle 保存目录信息的DIR结构体指针
    返回值 dirent 结构体指针
    NULL 文件读取完毕

    3 DIR结构体
    typedef struct _dirstream DIR;
    struct _dirstream
    {
      void *_fd; /* `struct hurd_fd' pointer for descriptor. */
      char *_data; /* Directory block. */
      int _entry_data; /* Entry number `__data' corresponds to. */
      char *_ptr; /* Current pointer into the block. */
      int _entry_ptr; /* Entry number `__ptr' corresponds to. */
      size_t _allocation; /* Space allocated for the block. */
      size_t _size; /* Total valid data in the block. */
      _libc_lock_define (, _lock) /* Mutex lock for this structure. */
    }

    4 dirent结构体
    struct dirent
    {
      long d_ino; /* inode number 索引节点号 */
      off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
      unsigned short d_reclen; /* length of this d_name 文件名长 */
      unsigned char d_type; /* the type of d_name 文件类型 */
      char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
    }


    5 closedir
    关闭参数dir所指的目录流,关闭成功返回0,失败返回-1
    头文件:  #include<dirent.h>
    函数原型  int closedir(DIR *dir);
    参数    dir 指向要关闭的目录流
    返回值    0 成功
                -1 失败,错误原因存于errno中

  • 相关阅读:
    Docker基本架构
    Dockerfile怎么创建镜像
    Dockerfile的指令
    Dockerfile基本结构
    Docker其它安全特性
    运行项目psychologicalTest
    第2章 安装Nodejs 2-4 Linux下安装Nodejs
    第2章 安装Nodejs 2-3 Windows下安装Nodejs
    第2章 安装Nodejs Nodejs基础 课程介绍
    2-2 第二天 利用 QQ 浏览器代理调试端口
  • 原文地址:https://www.cnblogs.com/cation/p/2843786.html
Copyright © 2011-2022 走看看