四时宝库

程序员的知识宝库

C++|利用链表实现在指定路径下遍历各级文件夹进行文件查找

文件在各级文件夹中查找可以利用递归实现,也可以通过链表实现:

运行效果:

附一个全盘查找指定类型文件的批处理文件:

@echo off
setlocal enabledelayedexpansion
echo. >c:\virus.txt
color 3a
echo.
set /a n = 0
set /p b=输入查找文件扩展名:
if /i "%b%"=="" cls && goto fh
echo 系统正在查找文件,请耐心等候......
echo.
::for %%a in (F E D C) do (
for %%a in (E) do (
cd /d %%a:\
	for /r %%b in (*.%b%) do (
		if exist "%%b" (
			echo %%b
			echo %%b>>c:\virus.txt
			set /a n+=1
			echo 现查到%b%文件个数:!n!
		)
	)
)
type c:\virus.txt | find /i "\" && goto no
echo.
echo 文件内容没找到!
del c:\virus.txt>nul 2>nul
echo.
pause
exit
:no
::cls
echo.
echo 文件查找完毕并记录在c:\virus.txt中 !
echo 现查到%b%文件总的个数:!n!
echo.
echo 是否打开文本查看记录 ?
echo.
echo 选择" Y "查看。 选择" N "退出。
echo.
set /p Choice=Y/N: 
IF /I '%Choice:~0,1%'=='y' goto A
IF /I '%Choice:~0,1%'=='n' goto B
pause
exit
:A
start c:\virus.txt
exit
pause
:b
exit

批处理运行效果:

附代码:

//#include "stdafx.h"
#pragma comment(linker, "/subsystem:console")
#include <windows.h>
#include "shellapi.h"
#pragma comment(lib,"shell32.lib") 
#include <stdio.h>
#include <stdlib.h>
#define num 222
struct DirList{
	char dirName[256]; //文件夹名
	DirList *pNext;
};
DirList *first,*newlist,*last;
void AddList(char *list)//加入文件夹链表
{
	newlist=new DirList;
	strcpy(newlist->dirName,list);
	newlist->pNext=NULL;
	//假如文件链表为空,那么第一个和最后一个节点都指向新节点
	if(first==NULL)
	{
		first=newlist;
		last=newlist;
	}
	//不为空,则原来最后一个节点指向新节点
	else
	{
		last->pNext=newlist;
		last=newlist;
	}	
}
//在某一路径(文件链表节点)下:①文件夹加入文件夹链表;②查找文件
void NodeFindFile(char *pRoad,char *pFile,FILE* fp)
{
	// ①文件夹加入文件夹链表
	char DirRoad[256]={0};
	strcpy(DirRoad,pRoad);
	strcat(DirRoad,"\\*.*");
	char FindedDir[256]={0};
	
	WIN32_FIND_DATA findData; //一个描述文件或文件夹的属性的结构
	HANDLE hFindFile;
	hFindFile=FindFirstFile(DirRoad,&findData);
	if(hFindFile!=INVALID_HANDLE_VALUE)
	{
		do
		{
			if(findData.cFileName[0]=='.')
				continue;
			//假如是文件夹,则加入文件夹链表
			if(findData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
			{
				strcpy(FindedDir,pRoad);	
				strcat(FindedDir,"\\");
				strcat(FindedDir,findData.cFileName);
				//加入文件夹列表
				AddList(FindedDir);
				memset(FindedDir,0x00,256);
			}
			//继续查找
		}while(FindNextFile(hFindFile,&findData));
	}
	//②查找文件
	char FileRoad[256]={0};
	strcpy(FileRoad,pRoad);
	strcat(FileRoad,"\\");
	strcat(FileRoad,pFile);
	char FindedFile[256]={0};
	//查找要查找的文件
	hFindFile=FindFirstFile(FileRoad,&findData);
	if(hFindFile!=INVALID_HANDLE_VALUE)
	{
		do
		{ 
			strcpy(FindedFile,pRoad);
			strcat(FindedFile,"\\");
			strcat(FindedFile,findData.cFileName);
			//输出查找到的文件
			fputs(FindedFile,fp);
			printf("%s\n",FindedFile);
			fprintf(fp, "\n");
			memset(FindedFile,0x00,256);
		}while(FindNextFile(hFindFile,&findData));
	}	
}
// 遍历文件链表,在每一个节点上调用NodeFindFile()
int ListSearchFile(char *Directory,char *SFile) 
{
	FILE* fp;
	fp=fopen("fileIndex.txt","a+");
	DirList NewList;	
	strcpy(NewList.dirName,Directory);
	NewList.pNext=NULL;
	//初始化第一个和最后一个节点
	last=&NewList;
	first=&NewList; 
	while(true)
	{	
		DirList *Find;
		//假如链表不为空,提取链表中的第一个节点,并把第一个节点指向原来第二个
		if(first!=NULL)
		{
			//提取节点
			Find=first;
			//并把第一个节点指向原来第二个
			first=first->pNext;
			//在提取的节点的目录下查找文件
			NodeFindFile(Find->dirName,SFile,fp);		
		}
		//为空则停止查找
		else
		{
			printf("文件搜索完毕\n");
			fclose(fp);
			return 0;		
		}		
	}
	fclose(fp);
	return 0;
	
}
int main(int argc, char* argv[])
{
	FILE* fp;
	fp=fopen("fileIndex.txt","w+");
	fputs("",fp);
	printf("%s","请输入需要查找的文件路径,如c:或c:\\\users\n");
	char ffpath[num]={0};
	fgets(ffpath,num,stdin);
	ffpath[strlen(ffpath)-1]='\0';
	printf("%s","请输入需要查找的文件名,如*.log\n");
	char ffname[num]={0};
	fgets(ffname,num,stdin);
	ffname[strlen(ffname)-1]='\0';
	ListSearchFile(ffpath,ffname);
	//system("fileIndex.txt");//进程正在使用
	ShellExecute(0, "open", "fileIndex.txt", "", NULL, SW_SHOW);
	//ListSearchFile(argv[1],argv[2]);
	system("pause");
	return 0;
}

-End-

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接