C++ 实现输出某个文件夹下所有文件名称,finddata_t、findfirst、findnext函数祥讲细讲解

简介: 利用C++实现输出某个文件夹下的文件名,需要用到的函数及其数据类型;

C++ 实现输出某个文件夹下所有文件名称;

利用C++实现输出某个文件夹下的文件名,需要用到的函数及其数据类型;

  • 需要一个结构体_finddata_t(头文件为:“io.h”),表示文件存储的基本信息;_finddata_t的结构体如下:
  • attrib ,文件的属性;其中包含A_AECH(封存)——文件修改和声明智能通过BACKUO命令行来实现、_A_HIDDEN(隐藏)、A_RDONLY(只读)、A_NORMAL(正常)、_A_SUBDIR(子目录)、_A_SYSTEM(系统) 等属性文件
  • time_create,文件创建时间;
  • time_access,文件最后访问时间;时间格式以 UTC 形式存储,可以用 localtime_s 转化为 本地时间;
  • 最后一次编辑时间;
  • size,文件字节长度;
  • name[_MAX_PATH],文件名字;
struct _finddata_t
{
    unsigned attrib;//文件属性的存储信息,包含有 ARCH存档、HIDDEN隐藏、NORMAL正常、RDONLY只读、SUBDIR文件夹、SYSTEM系统;
    time_t time_create;//创建时间
    time_t time_access;//最后一次访问时间
  time_t time_write;//最后一次修改时间;
    _fsize_t size;//
    char name[_MAX_PATH];
}

**_findfirst(char filespec, struct _finddata_t fileinfo)

  • 参数:
  • finespec : 要查找文件目录;
  • fileinfo:存放文件信息的指针;
  • 功能:


查找满足filrspec特性的第一个文件,查找成功返回一个搜索句柄(intputr_t类型,出事之前需要定义),来标识与 finespec 相同的特性,把信息以 _finddata_t结构体 存储在fileinfo里面;查找失败则会返回-1;

备注,函数初始化时,需要定义一个 intputr_t 类型的句柄,


*_findnext(intputr_t handle, struct _finddata_t fileinfo)


参数:

handle,_findfirst 函数返回的句柄,用来标识需要查找文件的特性;

fileinfo ,与 _findfirst 函数一样;


函数功能;

查询具有 handle特性 的下一个文件,成功后返回0,否则返回-1;

_findclose(intptr_t handle)


功能:关闭搜索句柄 (handle) ,释放内存资源;函数使用须在 findfirst 和 findclose 之后;

一个字符串容器,vector,存储符合条件的文件路径;


查找文件名称时,基本流程:先定义一个句柄:handle 和一个 _finddate_t 结构体,先利用 _findfirst 函数进行查找符合条件的第一个文件,再设置一个while循环,终止条件为 _findnext 函数查找失败;查找过程中,满足条件的文件存储在定义好的容器里;最后用 _findclose 释放内存。


代码实操;

用C++查找仅子目录全部文件名;
#define MAX_PATH =80
#include<iostream>
#include<vector>
#include<io.h>
#include<opencv2/imgproc.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
using namespace std;
using namespace cv;
//遍历path目录下的所有文件
void getFiles(string path, vector<string>& files)
{
      //文件句柄  
    intptr_t   hFile = 0;
      //文件信息,声明一个存储文件信息的结构体  
     struct _finddata_t fileinfo;
       string p;//字符串,存放路径
       if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)//若查找成功,则进入
     {
             do
             {
                   //如果是目录,迭代之(即文件夹内还有文件夹)  
           if ((fileinfo.attrib &  _A_SUBDIR))
           {
             //.表示当前目录;..表示当前目录的父目录;
             if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
               //进行向下递归;
               //getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
               files.push_back(p.assign(path).append("\\").append(fileinfo.name));
           }
             else
             {
                 files.push_back(p.assign(path).append("\\").append(fileinfo.name));
             }
           //cout << fileinfo.name << endl;
            } while(_findnext(hFile, &fileinfo)==0);          
             _findclose(hFile);
    }
 }
int main()
{
  vector<string> file;
  string str_22 = "E:\\ceshi";
  getFiles(str_22, file);
  for (int i = 0; i < file.size(); i++)
  {
    cout << file[i] << endl;
  }
  return 0;
}
用C++查找目录下的全部文件名;
  • 与上面脚本的最大区别就是进行向里递归查找;
#define MAX_PATH =80
#include<iostream>
#include<vector>
#include<io.h>
using namespace std;
using namespace cv;
//遍历path目录下的所有文件
void getFiles(string path, vector<string>& files)
{
      //文件句柄  
    intptr_t   hFile = 0;
      //文件信息,声明一个存储文件信息的结构体  
     struct _finddata_t fileinfo;
       string p;//字符串,存放路径
       if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)//若查找成功,则进入
     {
             do
             {
                   //如果是目录,迭代之(即文件夹内还有文件夹)  
           if ((fileinfo.attrib &  _A_SUBDIR))
           {
             //.表示当前目录;..表示当前目录的父目录;
             if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
               //进行向里递归;
               getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
               //files.push_back(p.assign(path).append("\\").append(fileinfo.name));
           }
             else
             {
                 files.push_back(p.assign(path).append("\\").append(fileinfo.name));
             }
           //cout << fileinfo.name << endl;
            } while(_findnext(hFile, &fileinfo)==0);          
             _findclose(hFile);
    }
 }
int main()
{
  vector<string> file;
  string str_22 = "E:\\ceshi";
  getFiles(str_22, file);
  for (int i = 0; i < file.size(); i++)
  {
    cout << file[i] << endl;
  }
  return 0;
}

用python代码实现相应功能,总的来看,python的确很简单,两行代码不到;比对于python来说,C++实现相同功能需要的时间周期会更长一点,但C++更注重底层逻辑思维的锻炼,想在计算机方面掌握更加精炼一点,建议多用用 C++ ;

  • 1,导入 os 库;
  • 2,利用 os.listdir(path),注:path 为需要查看的文件夹路径;
In [1]: import os
In [2]: path = os.listdir('E:/ceshi')
In [3]: path
Out[3]:
['1',
 '123feiyan.xlsx',
 '2.png',
 '20200212_195634.mp4',
 '222',
 'aaa.xlsx',
 'ab.csv',
 'cat',
 'ceshi1',
 'country_populations.mp4',
 'country_populations1.mp4',
 'data_mobile',
 'feiyan',
 'GAN_get_started',
 'highcharts',
 'icon',
 'pandas2',
 'tiranic',
 'trianic']
相关文章
|
6天前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数
|
9天前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
|
9天前
|
存储 数据挖掘 C语言
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
|
25天前
|
NoSQL API Redis
c++开发redis module问题之为什么在使用RedisModule_GetApi之前要通过((void**)ctx)[0]这种方式获取其地址
c++开发redis module问题之为什么在使用RedisModule_GetApi之前要通过((void**)ctx)[0]这种方式获取其地址
|
26天前
|
C++ 运维
开发与运维函数问题之析构函数在C++类中起什么作用如何解决
开发与运维函数问题之析构函数在C++类中起什么作用如何解决
29 11
|
26天前
|
C++ 运维
开发与运维函数问题之C++类的简单示例如何解决
开发与运维函数问题之C++类的简单示例如何解决
43 10
|
26天前
|
存储 C++ 运维
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
31 6
|
26天前
|
编译器 C++ 运维
开发与运维函数问题之函数的返回类型如何解决
开发与运维函数问题之函数的返回类型如何解决
25 6
|
3天前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
4天前
|
安全 C++ Windows
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)