目录操作(C语言)
头文件:
- #include<unistd.h>
- #include<sys/stat.h>
- #include<dirent.h>
读取目录
需要的头文件:#include<dirent.h>
-
打开目录,在失败的时候返回一个空的指针。
DIR * opendir(const char *path)
-
读取目录readdir,readdir相当于文件操作函数read,DIR结构体相当于文件操作里面的FILE结构体。
struct dirent *readdir(DIR *pDir)
dirent 结构体:
struct dirent { long d_ino; /* inode number 索引节点号 */ off_t d_off; /* 在目录文件中的偏移 */ unsigned short d_reclen; /* 文件名长 */ unsigned char d_type; /* 文件类型 */ char d_name [NAME_MAX+1]; /*文件名,最长256字符 */ }
-
关闭目录
int closedir(DIR *pDir)
创建目录:
int mkdir(const char *path, mode_t mode)
删除目录:
int rmdir(char *path)
获取当前目录绝对路径:
-
char * getcwd(char *path, size_t size)
getcwd成功则返回当前工作目录,失败返回 FALSE
参数:将当前工作目录的绝对路径复制到参数path所指的内存空间中,参数size为path的空间大小。
设置path为当前工作目录,需要对目录有x权限:
chdir(char *path)
设置fd对应的目录为当前工作目录:
fchdir(int fd)
例子:
#include<stdio.h>
#include<string.h> #include<sys/stat.h> #include<sys/types.h> #include<unistd.h> #include<errno.h> #include<dirent.h> int GetFileType(char *filePath,char *type) { if(filePath==NULL) { perror("the filePath is not NULL"); return -1; } struct stat stBuf; if(stat(filePath,&stBuf)) { fprintf(stderr,"fail to stat file[%s]:%s\n", filePath,strerror(errno)); return -1; } switch(stBuf.st_mode&S_IFMT) { case S_IFDIR: *type='d';break; case S_IFREG: *type='-';break; default: *type='o';break; } return 0; } int Tree(char *filePath,int deep) { DIR *pDir; struct dirent *pDent; char type; pDir=opendir(filePath); int i; char szSubDir[256]; if(pDir==NULL) { fprintf(stderr,"Faie to open:[%s]",filePath); return 0; } sprintf(szSubDir,"./%s",filePath); chdir(szSubDir); while(1) { pDent=readdir(pDir); if(pDent==NULL) { break; } if(strcmp(pDent->d_name,".")==0|| strcmp(pDent->d_name,"..")==0) { continue; } for(i=0;i<deep;i++) { printf("----"); } printf("%s\n",pDent->d_name); GetFileType(pDent->d_name,&type); if(type=='d') { Tree(pDent->d_name,deep+1); } } chdir("../"); closedir(pDir); return 0; } int main() { char szBuf[256]; getcwd(szBuf,256); Tree(szBuf,1); return 0; }
关于目录操作的一些其他函数:
-
void seekdir(DIR *pDir, long int locate)
类似fseek()
-
void rewinddir(DIR *pDir)
类似rewind()
-
long int telldir(DIR *pDir)
类似ftell()