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']
相关文章
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
52 6
|
2月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
25 0
C++ 多线程之线程管理函数
|
2月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
20 0
Linux c/c++文件的基本操作
|
2月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
31 3
|
2月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
211 1
|
2月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
35 1
|
2月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
47 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
3月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
3月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
25 3