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. gluPerspective和gluLookAt的关系

    参考文章 GL学习笔记(2) - 终于搞明白gluPerspective和gluLookAt的关系了(zz) gluPerspective的具体含义 解密--神秘的gluPerspective 函数原 ...

  2. [Recompose] Pass a React Prop to a Stream in RxJS

    When you declare your Component and Props in JSX, you can pass those props along to your RxJS stream ...

  3. iOS开发之软键盘使用小技巧

    在iOS开发过程中,有时候须要弹出软键盘进行输入,有时候又须要在某些情况下隐藏软键盘,以提高用户体验. 今天有几个关于软键盘的小技巧和大家分享. (1)仅仅弹出数字键盘 有某些需求中,要求用户仅仅能在 ...

  4. rac_grid自检提示缺少pdksh-5.2包

    原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...

  5. 识别CentOS和Ubuntu的系统版本

    识别CentOS和Ubuntu的系统版本1.用 lsb-release#!/bin/bashInstall_LSB(){        if [ "$PM" = "yum ...

  6. BZOJ2895: 球队预算

    [传送门:BZOJ2895] 简要题意: 在一个篮球联赛里,有n支球队,球队的支出是和他们的胜负场次有关系的,具体来说,第i支球队的赛季总支出是Ci*x^2+Di*y^2,Di<=Ci.(赢得多 ...

  7. linux关于用户密码家目录总结

    创建用户及其家目录useradd -d /home/tomcat -m tomcat接着修改密码passwd tomcat usermod -s /sbin/nologin + 用户名 禁止登录ssh ...

  8. HDU 5358 First One 数学+尺取法

    多校的题,摆明了数学题,但是没想出来,蠢爆了,之前算了半天的s[i][j]的和,其实是积.其实比赛的时候我连log(s[i][j])+1是s[i][j]的位数都没看出来,说出来都丢人. 知道了这个之后 ...

  9. css3 边框阴影效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 紫书 例题 9-12 UVa 12186 (树形dp)

    这道题还是比较简单的,对于当前节点,算出每个儿子需要的人数 然后再算出当前节点需要多少个人数,然后排个序加上去就好了. #include<cstdio> #include<vecto ...