1. 程式人生 > >C語言 通過遞迴 、_findfirst、_findnext函式實現 搜尋指定目錄的指定檔案

C語言 通過遞迴 、_findfirst、_findnext函式實現 搜尋指定目錄的指定檔案

主要使用:_findfirst、_findnext函式

OperateFile.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <io.h>
#include "FileOpreation_PYJ.h"

int main()
{
	char tempChar1[100]={0};
	char tempChar2[100]={0};

	printf("\nInput folder to search:");
	gets(tempChar1);
	printf("\nInput file to search:");
	gets(tempChar2);

	if(SearchFileInFolder(tempChar1,tempChar2)==0)
		printf("No such file\n");
			
}

FileOpreation_PYJ.h

#include <stdlib.h>

/***************************************
*函式名:SearchFileInFolder
*函式功能描述:搜尋指定目錄下,對應檔案,可進入子目錄搜尋
*函式引數:tempFolder-指定目錄,tempFile-檔案
*函式返回值:0-不成功,資料夾不存在\不能開啟,1-搜尋成功
*作者:龐一江
*函式建立日期 :2018-02-02
***************************************/
int SearchFileInFolder(char* tempFolder,char* tempFile)
{
			struct _finddata_t *FolderProperties,*FileProperties;
			long folderHandle=0,fileHandle=0;

			char *tempDeepFolder=NULL;
			char *tempPath1=NULL,*tempPath2=NULL;
			
			FolderProperties=(struct _finddata_t*)malloc(sizeof(struct _finddata_t));
			FileProperties=(struct _finddata_t*)malloc(sizeof(struct _finddata_t));
			
			tempPath1=(char*)realloc(tempPath1,(strlen(tempFolder)+2+1)*sizeof(char));
			tempPath2=(char*)realloc(tempPath2,(strlen(tempFolder)+1+strlen(tempFile)+1)*sizeof(char));
			memset(tempPath1,0,(strlen(tempFolder)+2+1)*sizeof(char));
			memset(tempPath2,0,(strlen(tempFolder)+1+strlen(tempFile)+1)*sizeof(char));
			
			strcat(strcat(tempPath1,tempFolder),"\\*\0");
			strcat(strcat(strcat(tempPath2,tempFolder),"\\\0"),tempFile);
			//*(tempPath1+strlen(tempFolder)+2)='\0';
			//*(tempPath2+strlen(tempFolder)+1+strlen(tempFile))='\0';
			
			
			if((folderHandle=_findfirst(tempPath1,FolderProperties))==-1)
				{
					printf("folder %s is not exist\n",tempFolder);		
					return 0;
				}
			else //若資料夾存在
				{
					//顯示當前目錄下所以符合條件的檔案
					if((fileHandle=_findfirst(tempPath2,FileProperties))!=-1)
					{	
						printf("%s\\",tempFolder);	
						printf("%s\n",FileProperties->name);	
						while(_findnext(fileHandle,FileProperties)==0)
						{
							printf("%s\\",tempFolder);	
							printf("%s\n",FileProperties->name);
						}
					}				
					
					//若為目錄,則進入目錄			
					while(_findnext(folderHandle,FolderProperties)==0)
					{
						if(((FolderProperties->attrib)&_A_SUBDIR)==_A_SUBDIR)	//若為目錄
							{								
															
								if((strcmp(FolderProperties->name,".."))!=0&&(strcmp(FolderProperties->name,"."))!=0)
									{
										//memset(tempDeepFolder,0,100*sizeof(char));
										tempDeepFolder=(char*)realloc(tempDeepFolder,(strlen(tempFolder)+1+strlen(FolderProperties->name)+1)*sizeof(char));
										memset(tempDeepFolder,0,(strlen(tempFolder)+1+strlen(FolderProperties->name)+1)*sizeof(char));									
										strcat(strcat(strcat(tempDeepFolder,tempFolder),"\\\0"),FolderProperties->name);
										//*(tempDeepFolder+strlen(tempFolder)+1+strlen(FolderProperties->name))='\0';
										
										SearchFileInFolder(tempDeepFolder,tempFile);	
									}							
							}					
					}
					return 1;
				}	
}

實現結果如下: