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中