• main的参数跟命令行解析通配符
#include <stdio.h>
 
#include<stdlib.h>
 
int main(int argc,char *argv[])
{
	printf("argc=%d\n",argc);
	
	exit(0);
}
 
  • ./main hello world
  • ./main *.c
  • {c} int glob(const char*pattern ,int flags,int(*errfunc)(const char *epath,int errno),glob_t *pglob);
  • {c} void globfree(glob_t *pglob);
  • GLOB_NOSORT提高局部效率问题;函数参数第一个模式,第二个常用要求,第三个一个指向函数的指针。保存出错路径与原因。第四个参数 结果存放位置。

要解析的pattern,解析到哪个路径失败了,可以打印;glob解析目录文件下的*不包含隐藏文件 .*包含隐藏文件。

#include<glob.h>
 
#if 0
#define PAT "/etc/a*.conf" 
 
int errfunc_(const char *erpath,int errno)
{
	puts(errpath);
	fprintf(stderr,"ERROR MSG:%s\n",strerror(error));
}
 
#endif
 
int main()
{
	gob_t globres;
	int err;
	err=glob(PAT,0,NULL,&globres);
	if(err)
	{
		printf("Error code = "%d\n",err);
		exit(1);
	}
	
	for(int i=0;i<globres.gl_pathc;i++)
		puts(globres.gl_pathv[i]);
		
	glob_free(&globres);
			
	exit(0);
}
 
 
  • ls -a =./* ./.*

得到所有文件,当前目录当成目录流

#include<dirent.h>
#define PAT "/etc"
 
int main()
{
	DIR *dp;
	struct dirent *cur;
	
	dp = opendir(PAT);
	if(dp == NULL)
	{
		perro("opendir()");
		exit(1);
	}
	
	while((cur = readdir(dp))!=NULL)
	{
	
	puts(cur->d_name);
	}	
	
	closedir(dp);
	
	exit(0);
 
}
 
 
 

解析目录结构

du:显示当前路径所占磁盘空间大小 k为单位,可以跟多个文件;用stat看block数除以2为k;

会用到递归:目录文件,非目录文件

#define PATHSIZE 1024
//longlong
 
static int path_noloop(const char *path)
{
	char *pos;
	
	pos=strrchr(path,'/');//最右边
	if(pos==NULL)
		exit(1);
	if(strcmp(pos+1,".") == 0||strcmp(pos+1,"..") == 0)
		return 0;
	return 1;
	
}
static int64_t mydu(const char *path)
{
	//path为非目录文件
	//return st_blocks/2;
	//path为目录文件,path/*与 path/.*(隐藏文件)掉用glob解析;stat;
	
	//判断 获得文件属性 不用state符号连接会展开
	struct stat statres;
	char nextpath[PATHSIZE];
	glob_t globres;
	int64_t sum
	if(lstat(path,&statres)<0)
	{
		perror("lstate");
		exit(1);
	}
	//宏与位图两种方式 mode
	if(!S_ISDIR(statres.st_mode))
		return statres.st_blocks;
	
	strncpy(nextpath,path,PATHSIZE);
	strncat(nextpath,"/*",PATHSIZE);//追加,整体长度不超过PATHSIZE
	//解析
	glob(nextpath,0,NULL,&globres);//iferr
	/*for()
		mydu();*/
	
	strncpy(nextpath,path,PATHSIZE);
	strncat(nextpath,"/.*",PATHSIZE);//构成回路 .指向自己;..指向父级
	glob(nextpath,GLOB_APPEND,NULL,&globres);//追加append
	//sum=0;
	sum=statres.st_blocks;
	
	for(i=0;i<globres.gl_pathc;i++)
	//有一个条件判断 不是自己和父级才去调用
	{
		if(path_noloop(globres.gl_pathv[i]))
			sum+=mydu(globres.gl_pathv[i]);
	}
	//当前文件
	//sum+=statres.st_blocks;
	globfree(&globres);
	return sum;
	
	
	
 
}
 
 
 
 
int main(int argc,char **argv)
{
	if(argc<2)
	{
		fprintf(stderr,"Usage...");
		exit(1);
	}
	
	printf("%lld\n",mydu(argv[1]/2));
}
 

优化 静态区 static