广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++如何遍历某个文件夹下面的子文件夹及其所有文件
  • 708
分享到

C++如何遍历某个文件夹下面的子文件夹及其所有文件

2023-06-20 18:06:58 708人浏览 安东尼
摘要

这篇文章主要介绍了c++如何遍历某个文件夹下面的子文件夹及其所有文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。方法一下面是输出当前目录下的所有文件夹以及文件的绝对路径(当

这篇文章主要介绍了c++如何遍历某个文件夹下面的子文件夹及其所有文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

方法一

下面是输出当前目录下的所有文件夹以及文件的绝对路径(当然也可以是相对路径,由输入的路径决定),下面的函数接口可以改装为单输出文件或者文件夹的接口,这是一个大方面的总接口。

#include <fstream>#include <iOStream>#include <string>#include <sstream>#include <vector>using namespace std;void getAllFiles(string path, vector<string>& files){    //文件句柄      long   hFile = 0;    //文件信息      struct _finddata_t fileinfo;  //很少用的文件信息读取结构    string p;  //string类很有意思的一个赋值函数:assign(),有很多重载版本    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)                {                files.push_back(p.assign(path).append("/").append(fileinfo.name));//保存文件夹名字                    getAllFiles(p.assign(path).append("/").append(fileinfo.name), files);//递归当前文件夹                }            }            else    //文件处理            {                files.push_back(p.assign(path).append("/").append(fileinfo.name));//文件名            }        } while (_findnext(hFile, &fileinfo) == 0);  //寻找下一个,成功返回0,否则-1        _findclose(hFile);    }}//测试void main(){    string DATA_DIR = "D:/CoderMaker/data_sets/lfw";    vector<string> files;    //测试    char * DistAll = "AllFiles.txt";    getAllFiles(DATA_DIR, files);//所有文件与文件夹的路径都输出    ofstream ofn(DistAll);  //输出文件流    int size = files.size();    int  FaiNum = 0;    ofn << size << endl;    for (int i = 0; i<size; i++)    {        ofn << files[i] << endl;

方法二

这次我们讲用一种windows/linux通用的方法遍历一个目录下的所有文件。

Windows/Linux的IDE都会提供一个头文件——<io.h>。看名字,似乎是关于I/O的,但是实际上它还提供了类似于WIN32_FIND_DATA**、FindFirstFile()、**FindNextFile()和FindClose()**的查找文件的功能。

_finddata_t结构

_finddata_t结构用来记录查找到的文件的信息。实际上有_finddata32_t、_finddata32i64_t、_finddata64i32_t、_finddata64_t、_wfinddata32_t、_wfinddata32i64_t、_wfinddata64i32_t、_wfinddata64_t八个结构,但都只是在32位/64位整数和字符类型上有所区别,但整体上相同。大致定义如下(MSDN):

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

对于不同的_finddata_t结构,time_create、time_access和time_write的类型为_time32_t或_time64_t,size的类型为_fsize_t或__int64,name为char[_MAX_PATH]或wchar_t[_MAX_PATH]。

attrib

unsigned类型,文件属性。

time_create

_time32_t/_time64_t类型,文件创建时间(FAT文件系统为-1)。以UTC格式存储,如果需要转换成当地时间,使用localtime_s()。

time_access

_time32_t/_time64_t类型,文件最后一次被访问的时间(FAT文件系统为-1)。以UTC格式存储,如果需要转换成当地时间,使用localtime_s()。

time_write

_time32_t/_time64_t类型,文件最后一次被写入的时间。以UTC格式存储,如果需要转换成当地时间,使用localtime_s()。

size

_fsize_t/__int64类型,文件的长度(以字节为单位)。

name

char[_MAX_PATH]/wchar_t[_MAX_PATH]类型,文件/目录名,不包含路径。

对于不支持文件创建时间、文件上一次访问时间的文件系统,time_create和time_access为-1。

_MAX_PATH在stdlib.h中被定义为260。

一般_finddata_t被定义为_finddata32_t/_finddata64i32_t,_wfinddata_t被定义为_wfinddata32_t/_wfinddata64i32_t。为方便,下文中将_finddata_t和_wfinddata_t统称为_finddata_t。

文件属性常量

一个文件/目录可以有多种属性,每种属性可以是下面列出的属性之一。

_A_ARCH

档案。文件被BACKUP指令改变或清除时被设置。值:0x20。

_A_HIDDEN

隐藏。使用DIR指令一般看不到,除非使用/AH选项。值:0x02。

_A_NORMAL

普通。文件没有更多属性被设置,可以没有限制地被读或写。值:0x00。

_A_RDONLY

只读。不能以“写”为目的打开该文件,并且不能创建同名的文件。值:0x01。

_A_SUBDIR

子目录。值:0x10。

_A_SYSTEM

系统文件。使用DIR指令一般看不见,除非使用/A或/A:S选项。值:0x04。

要检查x是否含有某个属性a,可以用x & a进行检查。指定多个属性可以使用按位or运算符,例如_A_SYSTEM | _A_RDONLY | _A_HIDDEN。

通配符(wildcards)

遍历文件目录时需要使用通配符。

_findfirst()/_findnext()/_findclose()函数

_findfirst()函数

intptr_t _findfirst(    const char * filespec,    struct _finddata_t *fileinfo);

handle

intptr_t类型,搜索句柄。

fileinfo

_finddata_t *类型,函数将会填入文件/目录信息。

返回值
如果成功,返回0,否则返回-1。如果没有更多能够找到的文件了,也会导致失败。

_findclose()函数

int _findclose(    intptr_t handle);

关闭搜索句柄并释放相应的资源。

handle
搜索句柄。

返回值
成功返回0,失败返回-1。

程序代码

1. 遍历目录下的所有文件

#include <iostream>#include <cstring>        // for strcat()#include <io.h>using namespace std;void listFiles(const char * dir);int main(){    char dir[200];    cout << "Enter a directory (ends with \'\\\'): ";    cin.getline(dir, 200);    strcat(dir, "*.*");        // 在要遍历的目录后加上通配符    listFiles(dir);    return 0;}void listFiles(const char * dir){    intptr_t handle;    _finddata_t findData;    handle = _findfirst(dir, &findData);    // 查找目录中的第一个文件    if (handle == -1)    {        cout << "Failed to find first file!\n";        return;    }    do    {        if (findData.attrib & _A_SUBDIR            && strcmp(findData.name, ".") == 0            && strcmp(findData.name, "..") == 0            )    // 是否是子目录并且不为"."或".."            cout << findData.name << "\t<dir>\n";        else            cout << findData.name << "\t" << findData.size << endl;    } while (_findnext(handle, &findData) == 0);    // 查找目录中的下一个文件    cout << "Done!\n";    _findclose(handle);    // 关闭搜索句柄}

程序遍历目录下的所有文件/目录,如果是文件则输出文件大小。

注意_findnext()函数成功返回0,因此要加上==0或!=-1进行判断,不能省略。

此外还有一个值得注意的地方:

if (findData.attrib & _A_SUBDIR    && strcmp(findData.name, ".")    && strcmp(findData.name, ".."))...

使用_findfirst()、_findnext()进行搜索时,可能会得到".“和”…"两个文件夹名。这两个值可以忽略。

2. 遍历目录中的所有文件

注意是“目录中”而不是“目录下”,这个程序将会遍历一个目录里包含的所有文件。

#include <iostream>#include <cstring>        // for strcpy(), strcat()#include <io.h>using namespace std;void listFiles(const char * dir);int main(){    char dir[200];    cout << "Enter a directory: ";    cin.getline(dir, 200);    listFiles(dir);    return 0;}void listFiles(const char * dir){    char dirNew[200];    strcpy(dirNew, dir);    strcat(dirNew, "\\*.*");    // 在目录后面加上"\\*.*"进行第一次搜索    intptr_t handle;    _finddata_t findData;    handle = _findfirst(dirNew, &findData);    if (handle == -1)        // 检查是否成功        return;    do    {        if (findData.attrib & _A_SUBDIR)        {            if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0)                continue;            cout << findData.name << "\t<dir>\n";            // 在目录后面加上"\\"和搜索到的目录名进行下一次搜索            strcpy(dirNew, dir);            strcat(dirNew, "\\");            strcat(dirNew, findData.name);            listFiles(dirNew);        }        else            cout << findData.name << "\t" << findData.size << " bytes.\n";    } while (_findnext(handle, &findData) == 0);    _findclose(handle);    // 关闭搜索句柄}

感谢你能够认真阅读完这篇文章,希望小编分享的“C++如何遍历某个文件夹下面的子文件夹及其所有文件”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网其他教程频道,更多相关知识等着你来学习!

--结束END--

本文标题: C++如何遍历某个文件夹下面的子文件夹及其所有文件

本文链接: https://www.lsjlt.com/news/298864.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作