UNIX环境高级编程读书笔记(二)—目录和文件(1)

来源:互联网 发布:克洛普 知乎 编辑:程序博客网 时间:2024/05/17 04:57

一、目录的打开和关闭

 

1.

名称:

opendir

目标:

打开一个目录。

头文件:

#include <sys/types.h>

#include < dirent.h>

函数原形:

DIR *opendir(const char *name)

参数:

name      目录名

返回值:

NULL     遇到错误

    

DIR *     打开成功

opendir用于打开一个目录,其功能和open相似。只不过open用于打开一个文件,而opendir用于打开一个目录。如果opendir可以成功打开一个目录,它就返回一个指向目录的指针,我们可以通过opendir的联机帮助知道这些内容。

首先在命令提示符后面键入[root@LINUX root]#man –k opendir来查找和opendir相关的联机帮助。我们可以得到以下内容:

opendir            (3)         -open a directory

这正是我们想要的。

然后我们可以键入[root@LINUX root]#man 3 opendir 来查看opendir[3]的联机帮助。

在帮助文档中我们可以看到这样一段话:

The opendir() function opens a directory stream correspondig to the directory name,and returns a pointer to the directory stream. The stream is positioned at the first entry in the directory.

The opendir() function rerurns a poin to the directory stream or NULL if an error occurred.

这些正是我们要找的信息. 除了这些信息我们还可以从帮助中获取诸如函数头文件,函数功能,函数原形,返回值,出错处理,相关函数等信息。大家试着用同样的方法来学习这些相关函数,达到举一返三的目的。

 

2

名称:

closedir

目标:

关闭一个目录.

头文件:

#include <sys/types.h>

#include < dirent.h>

函数原形:

int closedir(DIR *dir)

参数:

dir       指向目录的指针

返回值:

-1        遇到错误

    

0         打开成功,返回指向目录的指针。

 

二、目录的读取

3

名称:

readdir

目标:

读取目录内容。

头文件:

#include <unistd.h>

#include <lixux/dirent.h>

#include < linux/unistd.h>

函数原形:

int readdir(unsigned int fd ,struct dirent *dirp,unsigned int count)

参数:

fd        文件描述符

dirp       用于存放读入数据的数组

count      

返回值:

-1    遇到错误

    

0     打开成功

同样readdir的功能也和read相似,用于读取目录中内容。其实用open,read,close等函数也可以对目录目录操作的,但不是一个好的办法,因为Linux支持多种的目录类型,如AppleHFSISO9600VFAYNFS,如果用read来读,需要了解这些不同类型目录各自的结构细节。

利用这些函数我们可以编写不加参数的ls 命令,下面是代码。

/*2_1.c*/

 

#include < dirent.h>

#include <stdio.h>

#include <sys/types.h>

 

void show_dir(char dirname[]);

 

main(int ac,char *av[])

{

if(ac==1)

    show_dir(“.”);    / *读当前目录*/

else

    while(--ac)      

{

          printf(“%s:/n”,*++av);

          show_dir(*av);    /*读指定目录*/

     }

}

 

void show_dir(char dirname[])

{

DIR *dir_ptr;     /*定义目录类型的指针*/                 

struct dirent *direntp;       /*定义用于读目录的缓冲区*/

 

if((dir_ptr=opendir(dirname))==NULL)

    printf(“Can’t open!”);

else

{

    while((direntp=readdir(dir_ptr))!=NULL)

    printf(“%s/n”,direntp->d_name);

    closedir(dir_ptr);

}

}

 

 

三、目录的创建和删除

4

名称:

mkdir

目标:

创建目录

头文件:

#include < sys/stat.h>

#include <sys/types.h>

函数原形:

int result=mkdir(char *pathname,mode_t mode)

参数:

pathname   新建目录名

mode      权限位的掩码

返回值:

-1        遇到错误

    

0         成功创建

 

 

 

 

 

 

 

 

 

 

 

 

/*2_2.c*/

 

#include <unistd.h>

#include <sys/types.h>

 

main(int argc,char *argv[])

{

int result;

if(argc!=2)

    printf(“please input a direction.”);

if((result=mkdir(argv[1]))==-1)

    perror(“error”);

}

 

5

名称:

rmdir

目标:

删除一个目录,此目录必须为空

头文件:

#include <unistd.h>

函数原形:

int result=rmdir(const char *path);

参数:

path      目录名

返回值:

-1        遇到错误

    

0         成功删除

 

 

 

 

 

 

 

 

 

 

练习一:编写一个程序,删除一个现有的目录。