UNIX-LINUX编程实践教程->第三章->实例代码注解->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中

 

 

 

 

posted @ 2013-01-16 10:22  布兰姥爷  阅读(673)  评论(0编辑  收藏  举报