目录操作(C语言)
目录操作(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()