#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
DIR *fdopendir(int fd);
opendir() 函数打开一个目录流(stream) ,参数是目录的路径, 返回指向这个目录的流指针。这个流指针指向打开目录的第一个记录项。
fdopendir()和 opendir()类似, 但是返回值是一个已经打开的目录的目录流指针。
返回值 :opendir() 和fdopendir()函数返回一个目录流指针,出错的时候返回 NULL 并且会设置errno错误位。
ERRORS
EACCES Permission denied.权限不够
EBADF fd 不是一个有效的文件描述符,无法打开进行阅读。
EMFILE 文件描述符指向的文件被多个进程打开。
ENFILE 在该系统中打开了过多的文件。
ENOENT 目录不存在或目录名为空
ENOMEM 内存不足进行次操作
ENOTDIR name is not a directory.参数不是一个目录
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
readdir() 函数返回目录流指针指向的目录中的记录的下一项 。(第一次调用返回第一个记录项,第二次调用返回第二个记录项...)
在Linux中, dirent structure的定义大致如下:
//记录项的内容
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* 到下一个dirent的偏移 */
unsigned short d_reclen; /* 本记录项的长度 */
unsigned char d_type; /* 文件的类型,不支持所有文件系统*/
char d_name[256]; /* filename */
};
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
closedir() 函数关闭一个目录流指针关联的目录。一次成功的调用closedir() 将闭底层的文件描述符与各种相关联。在此调用后,目录流描述符各种不可用。
closedir() 成功返回0,不成功返回 -1 并设置 errno。
ERRORS错误标识
EBADF 目录流无效关联
1: #include <sys/types.h>
2: #include <dirent.h>
3: #include <sys/types.h>
4: #include <stdio.h>
5: #include <stdlib.h>
6: #include <string.h>
7: #include <errno.h>
8:
9: // struct dirent *readdir(DIR *dirp);
10: // DIR *opendir(const char *name);
11: // DIR *fdopendir(int fd);
12:
13: #define PATH_MAX_SIZE 2048
14: char DirName[PATH_MAX_SIZE]={0};
15: void mytree(char *path,int n)
16: {
17: if(path==NULL || n>9 || path[0]=='.' || path[0]=='\0'){
18: return ;
19: }
20: struct DIR* OpenDir=opendir(path);
21: if(OpenDir==NULL){
22: perror("open dir error ");
23: }
24:
25: long int errno_bak=errno;
26: char *space=(char*)malloc( n*4 +1);
27: memset(space,' ',n*4+1);
28: space[n*4+1]='\0';
29:
30: struct dirent* RdDir= NULL;
31: while((RdDir=readdir(OpenDir))!=NULL){
32: if(RdDir->d_type == DT_DIR){
33: strncpy(DirName,RdDir->d_name,255);
34: if(DirName[0]=='.'){
35: // RdDir=readdir(OpenDir);
36: continue;
37: }
38: printf("%s|__",space);
39: printf("%s\n",RdDir->d_name);
40:
41: if(strlen(path)+strlen(RdDir->d_name)<PATH_MAX_SIZE-2){
42: memset(DirName,0,PATH_MAX_SIZE);
43: strncpy(DirName,path,strlen(path));
44: DirName[strlen(path)]='/';
45: strncpy(DirName+strlen(path)+1,RdDir->d_name,strlen(RdDir->d_name));
46: // puts(DirName);
47: mytree(DirName,n+1);
48: }
49:
50: }else{
51: printf("%s|__",space);
52: printf("%s\n",RdDir->d_name);
53: }
54: }
55: free(space);
56: if(closedir(OpenDir)!=0){
57: perror("close dir error ");
58: exit(0);
59: }
60: if(errno != errno_bak){
61: perror("read dir error ");
62: exit(1);
63: }
64: }
65: //===========================================================
66:
67: int main(int argc,char* argv[])
68: {
69: if(argc < 2){
70: puts("Not input dir name");
71: exit(1);
72: }
73: mytree(argv[1],0);
74: return 0;
75:
76: }