在目录下搜索文件是否存在,并将其路径打印出来(文件)
前情提要
可以在本地先创个具体的文件夹目录
代码实现
#include <stdio.h>
#include<io.h>
#include<string.h>
#define MaxSize 100//这里是目录底下最多的文件数量设置,文件数量设置要多余等于实际情况,不然不能全部出来
int search(char *,char *,char *);//文件夹遍历函数
void Connect(char*,char*,char*);//字符串连接函数
void main()
{
char a[50]="";
char b[6]="\\*.*"; // *.*代表全部类型的文件,类似的 *.txt则代表txt类型的文件
char d[50]="";
printf("输入文件夹位置:");
scanf("%s",a); //输入你要遍历的目录
printf("输入想要查找的文件名称:");
scanf("%s",d);
search(a,b,d); //调用遍历文件夹的函数
}
int search(char *a,char *b,char *d)
{ //文件夹遍历函数
char c[100],*p1,*p2;
int i;
p1=c;
Connect(a,b,p1);
struct _finddata_t file;
long fHandle;
if( (fHandle=_findfirst(c, &file ))==-1L )
{
printf( "当前目录下没有文件\n");
return 0;
}
else
do{
if (file.attrib & _A_SUBDIR)
{
//判断是否为"."当前目录,".."上一层目录
if ((strcmp(file.name, ".") != 0) && (strcmp(file.name, "..") != 0))
{
char newPath[100];
p2=newPath;
Connect(a,"\\",p2);//函数执行完成后p2仍指向newPath[0]
for(int i=0;newPath[i]!='\0';i++){p2++;}//移动指针
Connect("",file.name,p2);
search(newPath,b,d);//递归调用
}
}
else{
char b1[MaxSize];//用来存放文件的具体位置,注意需要大量的空间
int j=0;
for(i=0;a[i]!='\0';i++)
b1[j++]=a[i];
b1[j++]='\\';
for(i=0;file.name[i]!='\0';i++)
b1[j++]=file.name[i];
b1[j]='\0';
if(strcmp(file.name,d)==0)//判断文件名是否找到,找到便输出
printf("%s\n",b1);
}
}while( _findnext(fHandle,&file)==0 );
_findclose( fHandle );
return 0;
}
void Connect(char* str1, char* str2, char* p)
{ //字符串连接函数
int i = 0;
while(*str1 != '\0')
{
*p = *str1;
str1++;p++;
}
while(*str2!='\0')
{
*p = *str2;
str2++;p++;
}
*p = '\0';//收尾结束
}
输出
输入
D:\网课安排\数据结构\实验九文件夹
代码解析
struct _finddata_t file;
/**
struct _finddata_t
{
unsigned attrib;
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;
char name[_MAX_FNAME];
};time_t time_create: 这里的time_t是一个变量类型(长整型?相当于long int?),用来存储时间的,我们暂时不用理它,只要知道,这个time_create变量是用来存储文件创建时间的就可以了。
time_t time_access: 文件最后一次被访问的时间。
time_t time_write: 文件最后一次被修改的时间。
_fsize_t size: 文件的大小。这里的_fsize_t应该可以相当于unsigned整型,表示文件的字节数。
char name [_MAX_FNAME ]:文件的文件名。这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。
*/
/**
long _findfirst( char *filespec, struct _finddata_t *fileinfo );返回值: 如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
*/
long fHandle;
if( (fHandle=_findfirst(c, &file ))==-1L )
{
printf( "当前目录下没有文件\n");
return 0;
}