viperchaos

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

用法:whereis    pathnanme   .文件后缀名

#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <limits.h>
#include <errno.h>
#include <string.h>

static  int    dopath();
void   	  checkfile();
char  	  *path_alloc(int *sizep);
char            *fullpath;
char            *filename;

int main(int argc, char *argv[])
{
	if(argc != 3)
		exit(1);	
	int pathlen, filelen;
	   fullpath = path_alloc( &pathlen );
	   strncpy(fullpath, argv[1], pathlen);//如果argv[1]长度大于pathlen,那么只有pathlen个字符复制到fullpath,它的结果将不会以NULL字节为结尾.
	   fullpath[pathlen - 1] = 0;
	
	   filename = path_alloc( &filelen );
           strncpy(filename, argv[2], filelen);
	   filename[filelen - 1] = 0;
	dopath();

	return 0;
}

static int dopath()
{
	struct stat statbuf;
	struct dirent *dirp;
	DIR *dp;
	char *ptr;

 	if(lstat(fullpath, &statbuf)<0) 
		return 1;
	if(S_ISDIR(statbuf.st_mode)==0) 
		checkfile();
	ptr=fullpath + strlen(fullpath);
	*ptr++ = '/';
	*ptr = 0;
	
	if((dp=opendir(fullpath)) == NULL) 
		return 1;

	while((dirp=readdir(dp)) != NULL)
	{
	if(strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0) 
		continue;
	strcpy(ptr, dirp->d_name);
	dopath();
	}

	*--ptr = 0;
	if(closedir(dp) < 0) printf("can't close directory %s\n",fullpath);
	return 0;
}
void checkfile()
{
	int i = 0;
	char *p1 = fullpath;
	p1 = p1 + strlen(fullpath)- strlen(filename);
	if(strcmp(filename, p1) == 0)
		printf("%s\n", fullpath);
}

#ifdef 	PATH_MAX
static int pathmax = PATH_MAX;
#else
static int pathmax = 0;
#endif

#define SUSV3 	200112L

static long posix_version = 0;

/* If PATH_MAX is indeterminate, no guarantee this is adequate */
#define PATH_MAX_GUESS 	1024

char *
path_alloc(int *sizep) /* also return allocated size, if nonull */
{
	char *ptr;
	int size;
	
	if (posix_version == 0)
		posix_version = sysconf(_SC_VERSION);

	if (pathmax ==0)	/* first time through */
	{
		errno = 0;
		if ((pathmax = pathconf("/", _PC_PATH_MAX)) < 0)
		{
			if (errno == 0)
				pathmax = PATH_MAX_GUESS;	/* it's indeterminate */
			else
				printf("pathconf error for _PC_PATH_MAX");
		}
		else
			pathmax++;	/* add one since it's relative to root */
	}
	if (posix_version < SUSV3)
		size = pathmax + 1;
	else
		size = pathmax;

	if ((ptr = malloc(size)) == NULL)
		printf("malloc error for pathname");

	if(sizep != NULL)
		*sizep = size;
	return(ptr);
}
posted on 2010-11-17 10:07  viperchaos  阅读(305)  评论(0编辑  收藏  举报