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

posted @ 2018-01-31 11:20  菜鸟也有高飞的时候  阅读(599)  评论(0编辑  收藏  举报