`
vaneng
  • 浏览: 18441 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
最近访客 更多访客>>
社区版块
存档分类
最新评论

C/C++读取文件夹下所有文件(转帖 未测试)

阅读更多
#include "stdlib.h"
#include "direct.h"
#include "string.h"
#include "io.h"
#include "stdio.h" 
#include "iostream.h"

class CBrowseDir
{
protected:
    //存放初始目录的绝对路径,以'\'结尾
    char m_szInitDir[_MAX_PATH];
    
public:
    //缺省构造器
    CBrowseDir();
    
    //设置初始目录为dir,如果返回false,表示目录不可用
    bool SetInitDir(const char *dir);
    
    //开始遍历初始目录及其子目录下由filespec指定类型的文件
    //filespec可以使用通配符 * ?,不能包含路径。
    //如果返回false,表示遍历过程被用户中止
    bool BeginBrowse(const char *filespec);
    
protected:
    //遍历目录dir下由filespec指定的文件
    //对于子目录,采用迭代的方法
    //如果返回false,表示中止遍历文件
    bool BrowseDir(const char *dir,const char *filespec);
    
    //函数BrowseDir每找到一个文件,就调用ProcessFile
    //并把文件名作为参数传递过去
    //如果返回false,表示中止遍历文件
    //用户可以覆写该函数,加入自己的处理代码
    virtual bool ProcessFile(const char *filename);
    
    //函数BrowseDir每进入一个目录,就调用ProcessDir
    //并把正在处理的目录名及上一级目录名作为参数传递过去
    //如果正在处理的是初始目录,则parentdir=NULL
    //用户可以覆写该函数,加入自己的处理代码
    //比如用户可以在这里统计子目录的个数
    virtual void ProcessDir(const char *currentdir,const char *parentdir);
};

CBrowseDir::CBrowseDir()
{
    //用当前目录初始化m_szInitDir
    getcwd(m_szInitDir,_MAX_PATH);   
    //如果目录的最后一个字母不是'\',则在最后加上一个'\'
    int len=strlen(m_szInitDir);
    if (m_szInitDir[len-1] != '\\')
        strcat(m_szInitDir,"\\");
}

bool CBrowseDir::SetInitDir(const char *dir)
{
    //先把dir转换为绝对路径
    if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
        return false;   
 
    //判断目录是否存在
    if (_chdir(m_szInitDir) != 0)
        return false;
    
    //如果目录的最后一个字母不是'\',则在最后加上一个'\'
    int len=strlen(m_szInitDir);
    if (m_szInitDir[len-1] != '\\')
        strcat(m_szInitDir,"\\");
    
    return true;
}

bool CBrowseDir::BeginBrowse(const char *filespec)
{
    ProcessDir(m_szInitDir,NULL);
    return BrowseDir(m_szInitDir,filespec);
}

bool CBrowseDir::BrowseDir(const char *dir,const char *filespec)
{
    _chdir(dir);
    
    //首先查找dir中符合要求的文件
    long hFile;
    _finddata_t fileinfo;
    if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
    {
        do
        {
            //检查是不是目录
            //如果不是,则进行处理
            if (!(fileinfo.attrib & _A_SUBDIR))
            {
                char filename[_MAX_PATH];
                strcpy(filename,dir);
                strcat(filename,fileinfo.name);
                cout << filename << endl;
                if (!ProcessFile(filename))
                    return false;
            }
        } while (_findnext(hFile,&fileinfo) == 0);
        _findclose(hFile);
    }
    //查找dir中的子目录
    //因为在处理dir中的文件时,派生类的ProcessFile有可能改变了
    //当前目录,因此还要重新设置当前目录为dir。
    //执行过_findfirst后,可能系统记录下了相关信息,因此改变目录
    //对_findnext没有影响。
    _chdir(dir);
    if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
    {
        do
        {
            //检查是不是目录
            //如果是,再检查是不是 . 或 .. 
            //如果不是,进行迭代
            if ((fileinfo.attrib & _A_SUBDIR))
            {
                if (strcmp(fileinfo.name,".") != 0 && strcmp
                    (fileinfo.name,"..") != 0)
                {
                    char subdir[_MAX_PATH];
                    strcpy(subdir,dir);
                    strcat(subdir,fileinfo.name);
                    strcat(subdir,"\\");
                    ProcessDir(subdir,dir);
                    if (!BrowseDir(subdir,filespec))
                        return false;
                }
            }
        } while (_findnext(hFile,&fileinfo) == 0);
        _findclose(hFile);
    }
    return true;
}

bool CBrowseDir::ProcessFile(const char *filename)
{
    return true;
}

void CBrowseDir::ProcessDir(const char 
                            *currentdir,const char *parentdir)
{
}

//从CBrowseDir派生出的子类,用来统计目录中的文件及子目录个数
class CStatDir:public CBrowseDir
{
protected:
    int m_nFileCount;   //保存文件个数
    int m_nSubdirCount; //保存子目录个数
    
public:
    //缺省构造器
    CStatDir()
    {
        //初始化数据成员m_nFileCount和m_nSubdirCount
        m_nFileCount=m_nSubdirCount=0;
    }
    
    //返回文件个数
    int GetFileCount()
    {
        return m_nFileCount;
    }
    
    //返回子目录个数
    int GetSubdirCount()
    {
        //因为进入初始目录时,也会调用函数ProcessDir,
        //所以减1后才是真正的子目录个数。
        return m_nSubdirCount-1;
    }
    
protected:
    //覆写虚函数ProcessFile,每调用一次,文件个数加1
    virtual bool ProcessFile(const char *filename)
    {
        m_nFileCount++;
        return CBrowseDir::ProcessFile(filename);
    }
    
    //覆写虚函数ProcessDir,每调用一次,子目录个数加1
    virtual void ProcessDir
        (const char *currentdir,const char *parentdir)
    {
        m_nSubdirCount++;
        CBrowseDir::ProcessDir(currentdir,parentdir);
    }
};

void main()
{
    //获取目录名
    char buf[256];
    printf("请输入要统计的目录名:");
    gets(buf);
    
    //构造类对象
    CStatDir statdir;
    
    //设置要遍历的目录
    if (!statdir.SetInitDir(buf))
    {
        puts("目录不存在。");
        return;
    }
    
    //开始遍历
    statdir.BeginBrowse("*.*");
    printf("文件总数: %d\n子目录总数:%d\n",statdir.GetFileCount(),statdir.GetSubdirCount());
} 


//这是我原来做的,是搜索目录的文件的一部分,你可以大致看一下Linux下如何使用目录属性
//代码不全,只是告诉你应该用到Linux的文件目录属性
//其他还需要你自己去做,多动手
static int searchFileTree(char* folder,int type)
{
    struct dirent* dir_ent;
    DIR*   dir;
    struct stat file_type;
    char   fullpath[PATH_MAX+1];

    memset(fullpath,0,PATH_MAX+1);
    if((dir = opendir(folder)) == NULL)//打开目录
    {
        printf("opendir failed!\n");
        return PATHERR;
    }
    while((dir_ent = readdir(dir)) != NULL){//查找目录内容
        if((dir_ent->d_name[0] == '.') ||(strcmp(dir_ent->d_name,"..")==0))
            continue;
        strcpy(fullpath,folder);
        strcat(fullpath,"/");
        strcat(fullpath,dir_ent->d_name);

        if((lstat(fullpath,&file_type)) < 0){
            continue;
        }

        if(S_ISDIR(file_type.st_mode)){
            if(searchFileTree(fullpath,type) == PATHERR){
                return PATHERR;
            }
        }else if(S_ISREG(file_type.st_mode)){
            if(isMedia(dir_ent->d_name,type) == IM_MEDIA)
                add2List(fullpath,dir_ent->d_name);
        }
    }
    closedir(dir);
    return PATHOK;
}
分享到:
评论

相关推荐

    vs2017 下 windows C/C++ 删除文件夹以及文件夹里的所有文件,遍历嵌套删除文件及文件夹

    在Windows环境下,使用C或C++编程语言进行文件和文件夹操作是一项常见的任务。Visual Studio 2017(VS2017)为开发者提供了丰富的库和工具来支持这样的功能。本文将深入探讨如何在VS2017中编写代码来删除文件夹及其...

    c++遍历文件夹及其子文件夹所有文件 并输出文件路径和文件内容

    在C++编程中,遍历文件夹及其子文件夹并输出所有文件的路径与内容是一项常见的任务,尤其在处理大量数据或进行文件管理时。这个程序的实现涉及到对操作系统文件系统的接口调用以及文件操作。以下是一份详细的步骤和...

    C++ 获取文件夹下的所有文件名

    C++ 获取文件夹下的所有文件名 C++ 获取文件夹下的所有文件名 C++ 获取文件夹下的所有文件名 C++ 获取文件夹下的所有文件名

    读文件及文件夹类.rar_C++读文件类_c++读取文件夹_读取文件_读取文件类_读文件

    例如,遍历文件夹中的所有文件: ```cpp #include #if __cplusplus &gt;= 201703L namespace fs = std::filesystem; #else namespace fs = boost::filesystem; #endif for (fs::directory_entry entry : fs:...

    用C/C++ 列出指定目录的所有文件夹和文件

    ### C/C++ 实现列出指定目录的所有文件夹和文件 #### 概述 本文将详细介绍如何使用 C/C++ 编程语言实现一个简单的程序来遍历指定目录,并列出该目录下的所有子目录与文件。本示例代码适用于 Windows 平台,并使用...

    c/c++项目文件夹清理工具

    python源码编写:c/c++项目文件夹清理工具,自动将项目文件夹清理成源码笔记。节省空间,方便保存 节省空间,方便保存 节省空间,方便保存 节省空间,方便保存 节省空间,方便保存 节省空间,方便保存 节省空间,...

    C++遍历文件夹下的所有文件

    使用C++遍历文件夹下的所有文件,FindFirstFile和FindNextFile的使用方法。

    MFC读取文件夹并且遍历该文件下面的所有文件

    在MFC(Microsoft Foundation Classes)环境下,开发C++应用程序时,常常需要处理文件系统操作,例如读取文件夹以及遍历其下的所有文件和子文件夹。本篇将详细讲解如何实现这一功能,并提供相关代码示例。 首先,...

    c/c++中文帮助文档(API)

    C++库函数不仅包括了C库的所有内容,还添加了更多面向对象的特性。例如,`iostream`库提供了流式输入输出,`std::cin`用于从标准输入读取,`std::cout`用于标准输出;`vector`和`list`是两种常用的容器,它们存储和...

    (VS2010 C++)删除指定目录及其下所有的文件夹,文件

    需要注意的是,这个过程不会删除非空目录,因此在删除完所有文件后,我们还需要检查目录是否为空,然后使用`RemoveDirectory`删除空目录。 在实际应用中,你应该考虑错误处理和权限问题。例如,用户可能没有足够的...

    C/C++使用WinIO读取CMOS数据代码

    本篇将详细讲解如何使用C/C++通过WinIO函数来实现CMOS数据的读取。 首先,我们需要了解WinIO是一个低级I/O库,它允许程序直接访问硬件端口,这对于与硬件交互的操作,如读写CMOS,非常有用。在Windows操作系统中,...

    C++遍历指定文件夹中的所有文件

    ### C++遍历指定文件夹中的所有文件 在C++编程语言中,有时我们需要实现对文件系统的操作,比如遍历指定文件夹中的所有文件。这种功能对于开发文件管理器、备份软件等应用非常实用。本文将详细介绍如何使用C++来...

    C++读取WAV格式音频文件

    在C++编程中,处理音频文件时,经常需要对各种格式的音频文件进行读取和解析。本篇将详细讲解如何使用C++来读取WAV格式的音频文件,以及涉及的相关知识点。 WAV是一种常见的无损音频格式,全称为Waveform Audio ...

    VSCODE C/C++ 插件离线包

    首先,我们要明确的是,"VSCODE C/C++ 插件离线包"是指针对VSCODE专门用于编写C和C++程序的扩展插件的离线安装版本。这个插件的主要作用是为VSCODE提供对C和C++语言的语法高亮、代码补全、调试等强大功能,极大地...

    vscode c/c++ 扩展

    - **配置文件**:创建或修改工作区的`.vscode/settings.json`文件,配置C/C++编译器路径和相关选项。 3. **使用技巧:** - **任务(task)**:利用VSCode的任务系统设置编译命令,一键编译运行程序。 - **...

    基于C++的VTK对不同格式的文件进行读取与另存源码和用到的素材文件.txt

    本资源包含基于C++的VTK对不同格式的文件进行读取与另存源码和用到的素材文件。 实例1:读取STL文件并渲染显示 实例2:读取VTI文件并渲染显示 实例3:读取VTK文件并渲染显示 实例4:读取MHA文件并渲染显示 实例5:...

    C/C++程序设计学习与实验系统

    在学C的时候碰到了麻烦,TurboC的.h文件好多VC没有,就上网找了一个这个工具。用这个来学习C参加二级考试挺实用的,是共享版,35块,比考试报名费便宜多了,不贵。机器码注册。官方介绍:原名《Turbo C/C++ for ...

    vscode VSCode C/C++ 单目录+多文件编译配置的实现示例

    vscode VSCode C/C++ 单目录+多文件编译配置的实现示例 vscode VSCode C/C++ 单目录+多文件编译配置的实现示例 vscode VSCode C/C++ 单目录+多文件编译配置的实现示例 vscode VSCode C/C++ 单目录+多文件编译配置的...

    C/C++中文文档(支持C++20和C18)和蓝桥杯C/C++组用的文档

    这个文档压缩包包含普通C/C++中文文档和蓝桥杯比赛时用的文档,C/C++中文文档是最新版,支持到C++20和C18,且包含以前版本的内容。蓝桥杯蓝桥杯C/C++组用的文档比正常文档更简略,但包含了ASCII码表。

    C/C++详细函数大全

    C++函数大全包含了C语言的所有函数,同时增加了许多C++特有的函数。比如,`new`和`delete`是C++中的内存管理函数,它们与C语言的`malloc`和`free`类似但更加强大,可以处理类对象的构造和析构。C++标准库中还包含...

Global site tag (gtag.js) - Google Analytics