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(-==Handle)
return -;
printf("%s\n",FileInfo.name);
while(!_findnext(Handle,&FileInfo))
{
printf("%s\n",FileInfo.name);
}
_findclose(Handle);
system("pause");
return ;
}
// 文件搜索.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <cstring>
#include <io.h> using namespace std; void visitDir(const char* dir,const char* fileName)
{
char dirNew[];
char fileNameNew[];
char file[]="\\*.";
strcpy(dirNew, dir);
strcpy(fileNameNew,fileName);
strcat(file,fileNameNew);
strcat(dirNew, file); // 在目录后面加上"\\*.*"进行第一次搜索
intptr_t handle;
_finddata_t findData;
handle = _findfirst(dirNew, &findData);
if (handle == -)// 检查是否成功
{
return;
}
do
{
if (findData.attrib & _A_SUBDIR)
{
if(strcmp(findData.name, ".") == || strcmp(findData.name, "..") == )
continue;
cout << findData.name << "\t<dir>\n";// 在目录后面加上"\\"和搜索到的目录名进行下一次搜索
strcpy(dirNew, dir);
strcat(dirNew, "\\");
strcat(dirNew, findData.name);
visitDir(dirNew,file);
}
else
cout << findData.name << "\t" << findData.size << " bytes.\n";
}while (_findnext(handle, &findData) == );
_findclose(handle);
} int main()
{
char dir[];
char file[];
cout<<"Enter a directory:";
cin.getline(dir,);
cout<<"Enter a file";
cin.getline(file,);
visitDir(dir,file);
system("pause");
return ;
}

当然,在找到所有需要的文件后,不仅仅可以通过终端打印出来,还可以进行删除、改名等操作。一般的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);
   }
  
}

C++遍历目录+_finddata_t结构体用法的更多相关文章

  1. u-boot include目录 gd_t结构体 如何关联芯片指定的目录

    1 u-boot /u-boot-2018.07-fmxx/include/config.h /* Automatically generated - do not edit */#define CO ...

  2. 驱动开发:内核遍历进程VAD结构体

    在上一篇文章<驱动开发:内核中实现Dump进程转储>中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍VAD结构,该结构的全程是Virtual Address Descrip ...

  3. matlab struct结构体用法

    结构体的赋值: 结构体的赋值,这里不建议用下面这种形式进行统一赋值, s = sturct('field1',values1,'field2',values2,-) 而是建议直接赋值,就是对每一个属性 ...

  4. C语言结构体用法

    结构体的定义: 方法一: struct student { char name[10]; int age; int number; }; struct student stu1; 方法二: struc ...

  5. C# 类&结构体&枚举

    类: class Lei  //要和static void Main(string[] args)平级: { public int lei_int;  //public是关键字,代表访问权限,这里是公 ...

  6. matlab结构体、数组和单元数组类型的创建

    matlab结构体.数组和单元数组类型的创建 @ 目录 matlab结构体.数组和单元数组类型的创建 matlab结构体类型 数组类型 单元数组类型 matlab结构体类型 通过字段赋值创建结构体 创 ...

  7. Go 语言 结构体和方法

    @ 目录 1. 结构体别名定义 2. 工厂模式 3. Tag 原信息 4. 匿名字段 5. 方法 1. 结构体别名定义 变量别名定义 package main import "fmt&quo ...

  8. pair<>结构体模版的用法

    1.pair算是一个结构体模版,定义的时候是这样的: pair<T1,T2> P; 其中T1,T2可以是int,string,double,甚至是vector<>. 2.进行初 ...

  9. 在Main中定义student的结构体,进行年龄从大到小依次排序录入学生信息。(结构体的用法以及冒泡排序)

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

随机推荐

  1. div的padding和margin

    原div一和div二的位置 增大div二的margin-left 增大div二的padding-top

  2. NodeJS学习笔记 进阶 (9)express+cookie-parser:签名机制深入剖析(ok)

    个人总结:这篇文章讲解了express框架种cookie的使用,需要引用cookie-parser这个包.读完这篇文章需要10分钟. 摘选自网络 文章导读 cookie-parser是Express的 ...

  3. Python IO编程-组织文件

    对于日常中遇到的批量任务,有些可以通过请求python完成自动化,我非常渴望拥有这些能力,在去年学习了python读写文件之后,我马上迫不及待的开始学习‘组织文件’,经过学习,我发现python组织文 ...

  4. PKU 2288 Islands and Bridges 状态dp

    题意: 给你一张地图,上面有一些岛和桥.你要求出最大的三角哈密顿路径,以及他们的数量. 哈密顿路:一条经过所有岛的路径,每个岛只经过一次. 最大三角哈密顿路:满足价值最大的哈密顿路. 价值计算分为以下 ...

  5. 题解 P3521 【[POI2011]ROT-Tree Rotations】

    这道题采用权值线段树合并的解法. 首先讲一下解法中出现的两个概念:权值线段树与线段树合并. 所谓权值线段树,可以理解为维护的信息反过来的普通线段树,我个人认为值域线段树这个名字其实要准确一些. 举个例 ...

  6. iOS framework配置脚本

    # Sets the target folders and the final framework product. FMK_NAME=HovnVoipEngine FMK_VERSION=1.0 # ...

  7. js实现复选框的操作-------Day41

    不知道之前的一篇为什么一直处于审核阶段.难道有哪个词语是敏感词被河蟹了? 无论了,又一次写了这篇,也算是加深记忆吧. 首先要写的是今天在进行表格数据操作时用到的对复选框checkbox的全选和全不选, ...

  8. hdu 3068 最长回文 【Manacher求最长回文子串,模板题】

    欢迎关注__Xiong的博客: http://blog.csdn.net/acmore_xiong?viewmode=list 最长回文                                 ...

  9. Anatomy of an IIS7 configuration path

    The concept of configuration paths is fundamental to managing and operating an IIS server, so I want ...

  10. SQL Server 多种分页查询效率

    关于SQL语句分页,网上也有很多,我贴一部分过来,并且总结自己已知的分页到下面,方便日后查阅. 方法1 适用于 SQL Server 任何版本 SELECT TOP 页大小 * FROM table1 ...