- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/types.h>
- #include <dirent.h>
- #include <errno.h>
- #include <stdlib.h>
- int search(const char*); //搜索当前以及其子目录
- void show(const char*); //显示整个链表
- void new_list(const char*); //新建链表
- void del_list(const char*); //删除链表
- struct PATH_LIST {
- struct PATH_LIST *last;
- struct PATH_LIST *next;
- char name[NAME_MAX];
- }path_list;
- char filename[NAME_MAX] = {0};
- int main(int argc, char *argv[])
- {
- char pathname[PATH_MAX] = {0};
- path_list.last = NULL;
- path_list.next = NULL;
- if (argc < 2) {
- printf("I need a path name and file name\\n");
- return(-1);
- }
- strncpy(pathname, argv[1], PATH_MAX);
- strncpy(filename, argv[2] ? argv[2] : argv[1], NAME_MAX);
- if(argc == 2) {
- getcwd(pathname, PATH_MAX);
- }
- strcpy(path_list.name, pathname);
- search(pathname);
- del_list(NULL); //delete全部链表
- }
- int search(const char *pathname)
- {
- DIR *dir;
- struct dirent *dirp;
- char pwd[NAME_MAX];
- if((dir = opendir(pathname)) == NULL) { //这样的出错处理没弄好,简单的加一个'/',还有错误代码没转换错误信息
- getcwd(pwd, NAME_MAX);
- printf("find: '%s/%s' : error %d\\n", pwd, pathname, errno);
- return(-1);
- }
- while((dirp = readdir(dir)) != NULL) { //遍历当前目录,如果read的是目录的话,递归调用search
- if(!strcmp(dirp->d_name, ".") || !strcmp(dirp->d_name, ".."))
- continue;
- if(!(strncmp(dirp->d_name, filename, dirp->d_reclen)))
- show(dirp->d_name);
- if(dirp->d_type == DT_DIR) {
- new_list(dirp->d_name);
- chdir(pathname);
- search(dirp->d_name);
- chdir("..");
- del_list(dirp->d_name);
- }
- }
- closedir(dir);
- return(0);
- }
- void show(const char *name)
- {
- int plen = strlen(path_list.name);
- struct PATH_LIST *temp;
- printf("%s", path_list.name);
- if(path_list.name[plen - 1] != '/')
- printf("/");
- temp = path_list.next;
- while(temp != NULL) {
- if(!strcmp(path_list.name, temp->name))
- break;
- printf("%s/", temp->name);
- temp = temp->next;
- }
- printf("%s\\n", name);
- }
- void new_list(const char *pathname)
- { //这里创建的是双向链表
- struct PATH_LIST *temp;
- if(path_list.next == NULL)
- temp = &path_list;
- else if(path_list.last != NULL)
- temp = path_list.last;
- temp->next = malloc(sizeof(struct PATH_LIST));
- strcpy(temp->next->name, pathname);
- temp->next->last = temp;
- temp->next->next = &path_list;
- path_list.last = temp->next;
- }
- void del_list(const char *pathname)
- {
- struct PATH_LIST *temp, *tail;
- temp = path_list.last;
- while(temp != NULL) {
- if(!strcmp(temp->name, path_list.name)) {
- path_list.next = NULL;
- path_list.last = NULL;
- break;
- }
- tail = temp->last;
- if(pathname == NULL) { //如果pathname == NULL,那删除整个链表
- free(temp);
- } else if(!strcmp(temp->name, pathname)){
- tail->next = temp->next;
- temp->next->last = tail;
- free(temp);
- break;
- }
- temp = tail;
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/040520149456.html
来源: http://www.codesnippet.cn/detail/040520149456.html