C++利用 _findfirst与_findnext查找文件的方法

 更新时间:2018年06月20日 11:05:46   作者:ranjiewen  
这篇文章主要给大家介绍了关于C++利用 _findfirst与_findnext查找文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

C++ 文件查找

在C++中我们要如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在的头文件中,结构体为struct _finddata_t ,函数为_findfirst、_findnext和_fineclose。具体如何使用,下面来一起看看吧

_findfirst与_findnext查找文件

一、这两个函数均在io.h里面。

二、首先了解一下一个文件结构体:

struct _finddata_t {
 unsigned attrib;
 time_t  time_create; 
 time_t  time_access; 
 time_t  time_write;
 _fsize_t size;
 char  name[260];
};

time_t,其实就是long

而_fsize_t,就是unsigned long

现在来解释一下结构体的数据成员吧。

attrib,就是所查找文件的属性:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、 _A_SUBDIR(文件夹)、_A_SYSTEM(系统)。

time_create、time_access和time_write分别是创建文件的时间、最后一次访问文件的时间和文件最后被修改的时间。

size:文件大小

name:文件名。

三、用 _findfirst 和 _findnext 查找文件

1、_findfirst函数:long _findfirst(const char *, struct _finddata_t *);

第一个参数为文件名,可以用"*.*"来查找所有文件,也可以用"*.cpp"来查找.cpp文件。第二个参数是_finddata_t结构体指针。若查找成功,返回文件句柄,若失败,返回-1。

2、_findnext函数:int _findnext(long, struct _finddata_t *);

第一个参数为文件句柄,第二个参数同样为_finddata_t结构体指针。若查找成功,返回0,失败返回-1。

3、_findclose()函数:int _findclose(long);

只有一个参数,文件句柄。若关闭成功返回0,失败返回-1。

#include <io.h>
#include <iostream>
#include <fstream>
using namespace std;

bool transfer(string fileName, int exeNum );
void dfsFolder(string folderPath, ofstream &fout);

int main()
{
  _finddata_t file;
  int k;
  long HANDLE;
  k = HANDLE = _findfirst("*.*", &file);
  while (k != -1)
  {
    cout << file.name << endl;
    k = _findnext(HANDLE, &file);
  }
  _findclose(HANDLE);

  transfer("C:\\Windows\\*.exe", 0);
  ofstream o_fstream;

  dfsFolder("E:\\\WHU\\Study", o_fstream);


  return 0;
}

//_findfirst 函数返回的是匹配到文件的句柄,数据类型为long。
//遍历过程可以指定文件类型,这通过FileName的赋值来实现,例如要遍历C : \WINDOWS下的所有.exe文件

bool transfer(string fileName , int exeNum)
{
  _finddata_t fileInfo;
  long handle = _findfirst(fileName.c_str(), &fileInfo);

  if (handle == -1L)
  {
    cerr << "failed to transfer files" << endl;
    return false;
  }

  do
  {
    exeNum++;
    cout << fileInfo.name << endl;
  } while (_findnext(handle, &fileInfo) == 0);
  cout << " .exe files' number: " << exeNum << endl;

  return true;
}

//遍历文件夹及其子文件夹下所有文件。操作系统中文件夹目录是树状结构,使用深度搜索策略遍历所有文件。用到_A_SUBDIR属性


//在判断有无子目录的if分支中,由于系统在进入一个子目录时,匹配到的头两个文件(夹)是"."(当前目录),".."(上一层目录)。
//需要忽略掉这两种情况。当需要对遍历到的文件做处理时,在else分支中添加相应的代码就好

void dfsFolder(string folderPath, ofstream &fout)
{
  _finddata_t FileInfo;
  string strfind = folderPath + "\\*";
  long Handle = _findfirst(strfind.c_str(), &FileInfo);

  if (Handle == -1L)
  {
    cerr << "can not match the folder path" << endl;
    exit(-1);
  }
  do{
    //判断是否有子目录 
    if (FileInfo.attrib & _A_SUBDIR)
    {
      //这个语句很重要 
      if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
      {
        string newPath = folderPath + "\\" + FileInfo.name;
        dfsFolder(newPath, fout);
      }
    }
    else
    {
      fout<<folderPath.c_str() << "\\" << FileInfo.name << " ";
      cout << folderPath.c_str() << "\\" << FileInfo.name << endl;
    }
  } while (_findnext(Handle, &FileInfo) == 0);

  _findclose(Handle);
  fout.close();
}


//#include <iostream>  
//#include <string>  
//#include <io.h>  
//using namespace std;
//
//int main()
//{
//  _finddata_t file;
//  long longf;
//  string tempName;
//  //_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *)  
//  if ((longf = _findfirst("E:\\WHU\\Study\\*.*", &file)) == -1l)
//  {
//    cout << "文件没有找到!\n";
//    return 0;
//  }
//  do
//  {
//    cout << "文件列表:\n";
//    tempName = file.name;
//    if (tempName[0] == '.')
//      continue;
//    cout << file.name<<endl;
//
//    if (file.attrib == _A_NORMAL)
//    {
//      cout << " 普通文件 ";
//    }
//    else if (file.attrib == _A_RDONLY)
//    {
//      cout << " 只读文件 ";
//    }
//    else if (file.attrib == _A_HIDDEN)
//    {
//      cout << " 隐藏文件 ";
//    }
//    else if (file.attrib == _A_SYSTEM)
//    {
//      cout << " 系统文件 ";
//    }
//    else if (file.attrib == _A_SUBDIR)
//    {
//      cout << " 子目录 ";
//    }
//    else
//    {
//      cout << " 存档文件 ";
//    }
//    cout << endl;
//  } while (_findnext(longf, &file) == 0);//int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1  
//
//  _findclose(longf);
//
//  return 0;
//}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • 一文详解C++中的mutable关键字

    一文详解C++中的mutable关键字

    在C++中mutable关键字正如字面意思所示,表示「可变的」之意,一般在以下两种情况中使用较多,一是修饰类中的变量,用来突破const的限制,二是在Lambda表达式中使用,用来捕获修改表达式之外的变量值,下面我们就针对这两种使用场景逐个介绍
    2023-10-10
  • C语言 while for do while循环体详解用法

    C语言 while for do while循环体详解用法

    在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件
    2021-10-10
  • Qt实现电子时钟

    Qt实现电子时钟

    这篇文章主要为大家详细介绍了Qt实现电子时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C语言中栈的两种实现方法详解

    C语言中栈的两种实现方法详解

    栈只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作,这篇文章主要介绍了C语言对栈的实现基本操作
    2021-08-08
  • C语言实现扫雷游戏(可以自动展开)

    C语言实现扫雷游戏(可以自动展开)

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏,可以自动展开,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C++实现LeetCode(202.快乐数)

    C++实现LeetCode(202.快乐数)

    这篇文章主要介绍了C++实现LeetCode(202.快乐数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C/C++混合编程之extern “C”的使用示例

    C/C++混合编程之extern “C”的使用示例

    这篇文章主要给大家介绍了关于C/C++混合编程之extern “C”使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • C/C++实现发送与接收HTTP/S请求的示例代码

    C/C++实现发送与接收HTTP/S请求的示例代码

    HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的协议,它是一种无状态的、应用层的协议,用于在计算机之间传输超文本文档,通常在 Web 浏览器和 Web 服务器之间进行数据通信,本文给大家介绍了C/C++发送与接收HTTP/S请求,需要的朋友可以参考下
    2023-11-11
  • 解析static在C和C++中的用法以及区别

    解析static在C和C++中的用法以及区别

    以下是对static在C和C++中的用法以及区别进行了详细的分析介绍。需要的朋友可以过来参考下
    2013-08-08
  • C语言位运算和sizeof运算符详解

    C语言位运算和sizeof运算符详解

    这篇文章主要介绍了C语言位运算和sizeof运算符详解的相关资料,这里提供了详细的知识要点,并附简单代码示例,需要的朋友可以参考下
    2016-11-11

最新评论