C++遍历⽬录+_finddata_t结构体⽤法
Struct _finddata_t是⽤来存储⽂件各种信息的结构体,使⽤这个结构体要引⽤的头⽂件为“ #include <io.h>”它的结构体定义如下:
struct _finddata_t
{
unsigned attrib;
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;
char name[_MAX_FNAME];
};
改结构体中各成员的变量的含义如下:
unsigned atrrib:
⽂件属性的存储位置。它存储⼀个unsigned单元,⽤于表⽰⽂件的属性。⽂件属性是⽤位表⽰的,主要有以下⼀些:
_A_ARCH(存档)、
_A_HIDDEN(隐藏)、
_A_NORMAL(正常)、
_A_RDONLY(只读)、
_A_SUBDIR(⽂件夹)、
_A_SYSTEM(系统)
这些都是在中定义的宏,可以直接使⽤,⽽本⾝的意义其实是⼀个⽆符号整型(只不过这个整型应该是2的⼏次幂,从⽽保证只有⼀位为1,⽽其他位为0)。既然是位表⽰,那么当⼀个⽂件有多个属性时,
它往往是通过位或的⽅式,来得到⼏个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
time_t time_create:这⾥的time_t是⼀个变量类型,实际上就是长整形变量 long int,⽤来保存从1970年1⽉1⽇0时0分0秒到现在时刻的秒数
time_t time_access:⽂件最后⼀次被访问的时间。
time_t time_write:⽂件最后⼀次被修改的时间。
_fsize_t size:⽂件的⼤⼩(字节数表⽰)。
char name[_MAX_FNAME]:⽂件的⽂件名。这⾥的_MAX_FNAME是⼀个常量宏,它在头⽂件中被定义,表⽰的是⽂件名的最⼤长度。
如何使⽤这个结构体才能够将⽂件的信息存储到该结构体的内存空间呢,这就需要_findfirst()、_findnext()和_fineclose()三个函数的搭配使⽤,下⾯介绍这三个函数:
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
返回值:如果查成功的话,将返回⼀个long型的唯⼀的查⽤的句柄。这个句柄将会在_findnext函数中被使⽤。失败返回0.
参数:
filespec:标明⽂件的字符串,可⽀持通配符。⽐如:*.c,则表⽰当前⽂件夹下的所有后缀为C的⽂件。
fileinfo :这⾥就是⽤来存放⽂件信息的结构体的指针。这个结构体必须在调⽤此函数前声明,不过不⽤初始化,只要分配了内存空间就可以了。函数成功后,函数会把到的⽂件的信息放⼊这个结构体所分配的内存空间中。
int _findnext( long handle, struct _finddata_t *fileinfo );
返回值:若成功返回0,否则返回-1。
参数:
handle :_findfirst函数返回回来的句柄。
该结构体和搭配的函数使⽤的逻辑就是先⽤_findfirst查第⼀个⽂件,若成功则⽤返回的句柄,调⽤_findnext函数查其他的⽂件,当查完毕后⽤,⽤_findclose函数结束查。下⾯我们就按照这样的思路来编写⼀个查某⼀个⽂件夹下的所有word⽂档的程序。
#include<stdio.h>
#include<io.h>
#include<Windows.h>
#define ADDR "E://Test//*.docx"
const char* SreachAddr=ADDR;
int main(void)
{
long Handle;
struct _finddata_t FileInfo;
Handle=_findfirst(SreachAddr,&FileInfo);
if(-1==Handle)
return -1;
printf("%s\n",FileInfo.name);
while(!_findnext(Handle,&FileInfo))
{
printf("%s\n",FileInfo.name);
}
_findclose(Handle);
system("pause");
return0;
}
// ⽂件搜索.cpp : 定义控制台应⽤程序的⼊⼝点。
//
#include "stdafx.h"
#include <iostream>
#include <cstring>
#include <io.h>
using namespace std;
void visitDir(const char* dir,const char* fileName)
{
char dirNew[100];
char fileNameNew[100];
char file[10]="\\*.";
strcpy(dirNew, dir);
strcpy(fileNameNew,fileName);
strcat(file,fileNameNew);
strcat(dirNew, file); // 在⽬录后⾯加上"\\*.*"进⾏第⼀次搜索
intptr_t handle;
_finddata_t findData;
handle = _findfirst(dirNew, &findData);
if (handle == -1)// 检查是否成功
{
return;
}
do
{
if (findData.attrib & _A_SUBDIR)
{
if(strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0)
continue;
cout << findData.name << "\t<dir>\n";// 在⽬录后⾯加上"\\"和搜索到的⽬录名进⾏下⼀次搜索
strcpy(dirNew, dir);
strcat(dirNew, "\\");
c语言struct头文件strcat(dirNew, findData.name);
visitDir(dirNew,file);
}
else
cout << findData.name << "\t" << findData.size << " bytes.\n";
}while (_findnext(handle, &findData) == 0);
_findclose(handle);
}
int main()
{
char dir[100];
char file[100];
cout<<"Enter a directory:";
cout<<"Enter a file";
visitDir(dir,file);
system("pause");
return0;
}
当然,在到所有需要的⽂件后,不仅仅可以通过终端打印出来,还可以进⾏删除、改名等操作。⼀般的C语⾔病毒会⽤到这个结构体加配合函数进⾏到某⼀类型的⽂件然后进⾏恶意删除,例如某⼀C语⾔病毒中的删除操作代码如下:
void Remove()
{
intptr_t done;
int i;
struct _finddata_t ffblk;
char *documenttype[3] = {"D://aaaa//*.txt","D://aaaa//*.exe","D://aaaa//*.bin"}; for (i = 0; i < 3; i++)
{
char fillPath[100]="D://aaaa//";
done = _findfirst(documenttype[i],&ffblk);
strcat(fillPath,ffblk.name);
int a= remove(fillPath);
while (!_findnext(done,&ffblk))
{
char fillPath1[100]="D://aaaa//";
strcat(fillPath1,ffblk.name);
int b= remove(fillPath1);
}
_findclose(done);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论