10Linux服务器编程之:opendir()函数,readdir()函数,rewinddir()函数,telldir()函数和seekdir()函数,closedir()函数



1 opendir所需的头文件

#include<sys/types.h>

#include<dirent.h>

2函数声明

DIR *opendir(const char *name);

DIR *fdopendir(int fd);

通过opendir来打开一个文件夹

3readdir依赖的头文件

#include<dirent.h>

4函数声明

struct dirent *readdir(DIR *dirp);

int readdir_r(DIR *dirp, struct dirent*entry, struct dirent **result);

函数说明

通过这两个函数实现读取目录

关于struct dirent,定义如下:

struct dirent {

    ino_t  d_ino;             /* inode number */

    off_t  d_off;             /* not an offset; see NOTES */

     unsignedshort d_reclen;    /* length of this record*/

    unsigned char d_type;      /* typeof file; not supported

                             by all filesystem types */

    char d_name[256];        /* filename */

};

readdir每次返回一条记录项,DIR*指针指向下一条记录项

6.rewinddir

#include <sys/types.h>

#include <dirent.h>

void rewinddir(DIR *dirp);

把目录指针恢复到目录的起始位置。

7.telldir/seekdir

#include <dirent.h>

long telldir(DIR *dirp);

#include <dirent.h>

void seekdir(DIR *dirp, long offset);

 

函数描述

telldir - return current location indirectory stream

 

The  telldir() function returns the current location associated with

       the directory stream dirp.

 

8.closedir

#include<sys/types.h>

#include<dirent.h>

int closedir(DIR*dirp);

函数描述

The  closedir() function closes the directory stream associated with

       dirp. A successful call to closedir() also  closes  the underlying

       file descriptor associated with dirp. The directory stream descrip

       tor dirp is not available after thiscall.

 

9.通过递归的方式遍历目录

#include<sys/types.h>

#include<sys/stat.h>

#include<unistd.h>

#include<dirent.h>

#include<stdio.h>

#include<string.h>

#define MAX_PATH1024

/* dirwalk: applyfcn to all files in dir */

void dirwalk(char*dir, void (*fcn)(char *))

{

char name[MAX_PATH];

struct dirent *dp;

DIR *dfd;

if ((dfd = opendir(dir)) == NULL) {

fprintf(stderr, "dirwalk: can‘t open%s\n", dir);

return;

}

while ((dp = readdir(dfd)) != NULL) {

if (strcmp(dp->d_name, ".") ==0

|| strcmp(dp->d_name, "..") ==0)

continue; /* skip self and parent */

if (strlen(dir)+strlen(dp->d_name)+2> sizeof(name))

fprintf(stderr, "dirwalk: name %s %stoo long\n",

dir, dp->d_name);

else {

sprintf(name, "%s/%s", dir,dp->d_name);

(*fcn)(name);

}

}

closedir(dfd);

}

 

/* fsize: printthe size and name of file "name" */

void fsize(char*name)

{

struct stat stbuf;

if (stat(name, &stbuf) == -1) {

fprintf(stderr, "fsize: can‘t access%s\n", name);

return;

}

if ((stbuf.st_mode & S_IFMT) ==S_IFDIR)

dirwalk(name, fsize);

printf("%8ld %s\n",stbuf.st_size, name);

}

 

int main(intargc, char **argv)

{

if (argc == 1) /* default: currentdirectory */

fsize(".");

else

while (--argc > 0)

fsize(*++argv);

return 0;

}

这个程序还是不如ls -R健壮,它有可能死循环,思考一下什么情况会导致死循

环。

10Linux服务器编程之:opendir()函数,readdir()函数,rewinddir()函数,telldir()函数和seekdir()函数,closedir()函数

上一篇:windows api实现星空流动


下一篇:单例模式