`

[转]C++下遍历文件夹

    博客分类:
  • C++
 
阅读更多
Link:http://www.cnblogs.com/summerRQ/articles/2375749.html
编写程序遍历文件夹及其子文件夹下所有文件,并输出到标准输出流或者文件流。
1. 先考虑在单层目录下,遍历所有文件。以C:\WINDOWS为例:
用到数据结构_finddata_t,文件信息结构体的指针。

struct _finddata_t
{
    unsigned attrib;     //文件属性
    time_t time_create;  //文件创建时间
    time_t time_access;  //文件上一次访问时间
    time_t time_write;   //文件上一次修改时间
    _fsize_t size;  //文件字节数
    char name[_MAX_FNAME]; //文件名
}; 


文件属性是无符号整数,取值为相应的宏:_A_ARCH(存档),_A_SUBDIR(文件夹),_A_HIDDEN(隐藏),_A_SYSTEM(系统),_A_NORMAL(正常),_A_RDONLY(只读)。容易看出,通过这个结构体,我们可以得到关于该文件的很多信息。结合以下函数,我们可以将文件信息存储到这个结构体中:
//按FileName命名规则匹配当前目录第一个文件
_findfirst(_In_ const char * FileName, _Out_ struct _finddata64i32_t * _FindData); 
 //按FileName命名规则匹配当前目录下一个文件
_findnext(_In_ intptr_t _FindHandle, _Out_ struct _finddata64i32_t * _FindData);
 //关闭_findfirst返回的文件句柄
_findclose(_In_ intptr_t _FindHandle);

_findfirst 函数返回的是匹配到文件的句柄,数据类型为long。遍历过程可以指定文件类型,这通过FileName的赋值来实现,例如要遍历C:\WINDOWS下的所有.exe文件
bool transfer(string fileName = "C:\\Windows\\*.exe", int exeNum = 0)
{
    _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;
}


2. 遍历文件夹及其子文件夹下所有文件。操作系统中文件夹目录是树状结构,使用深度搜索策略遍历所有文件。用到_A_SUBDIR属性,可运行程序如下:
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 << "\\" << FileInfo.name  << " ";
        }
    }while (_findnext(Handle, &FileInfo) == 0);

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

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


遍历某种类型文件
BOOL LoadFilesFromDirecroty(CString strDirectory)
{
    WIN32_FIND_DATA cFindData;
    HANDLE hFind = NULL;
    CString strFullPathName;
    strFullPathName = strDirectory + _T("\\*.DLL");

    hFind = FindFirstFile(strFullPathName, &cFindData);
    if (INVALID_HANDLE_VALUE == hFind)
    {
        FindClose(hFind);
        return FALSE;
    }

    do
    {
        if(cFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            //Special for return
            if (strcmp(cFindData.cFileName, ".") == 0
             && strcmp(cFindData.cFileName, "..") == 0 )
            {
                LoadFilesFromDirecroty(strFullPathName + cFindData.cFileName);
            }
        }
        else
        {
            CString strTemp = cFindData.cFileName;
            strTemp += "";
        }


    }while(::FindNextFile(hFind, &cFindData));

    FindClose(hFind);
    return TRUE;
}


TCHAR buf[MAX_PATH];
CString strPath;
GetCurrentDirectory(1000, buf);  //得到当前工作路径
strPath = buf; LoadFilesFromDirecroty(strPath);
分享到:
评论

相关推荐

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

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

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

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

    Linux-C++-遍历指定文件夹路径下的文件列表并将路径写到txt文件

    本教程将探讨如何遍历指定文件夹路径下的所有文件,并将这些文件的路径写入一个TXT文本文件。这在处理大量数据或者需要自动化文件管理时非常有用。 首先,我们需要了解Linux系统中的文件路径和文件操作的基本概念。...

    c语言遍历文件夹下的文件

    c c++ c语言遍历文件夹 c语言读文件 c语言写文件 高效算法

    C++实现遍历文件夹内的所有文件

    在C++编程中,遍历文件夹及其子文件夹是一项常见的任务,这通常涉及到文件系统操作。本示例中,我们将探讨如何使用C++来实现这个功能,同时统计文件个数和子文件夹个数。这里,我们主要关注以下几个关键知识点: 1....

    利用C++Builder遍历文件目录(TXT)

    利用C++Builder我们可以轻松地实现类似Windows的EXPlorer的目录树

    C++各种遍历文件夹代码.docx

    本篇将深入讲解如何使用C++遍历文件夹,包括单层遍历和递归遍历,并结合提供的代码进行分析。 首先,我们来看单层遍历文件夹的方法。在提供的代码中,`transfer`函数使用了Windows API中的`_findfirst`和`_findnext...

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

    ### C++遍历指定文件夹下的所有文件:深入解析与实现 在计算机编程领域,特别是文件操作方面,遍历指定目录下的所有文件是一项常见的需求。本文将深入探讨如何使用C++来实现这一功能,通过分析代码片段,我们将理解...

    c语言遍历文件夹生成的可执行文件

    c c++ c语言遍历文件夹 c语言读文件 c语言写文件

    C++遍历文件夹下所有文件的多种方法

    C/C++遍历文件夹感觉真是很不好用,建议还是使用C/C++做单任务处理,然后通过脚本语言实现遍历比较合理。 CBrowseDir.h #include #include #include #include #include #include &lt;vector&gt;

    遍历文件夹并建成目录树

    在IT领域,遍历文件夹并建成目录树是一项常见的任务,尤其在文件管理、数据处理和自动化脚本编写中。这个过程涉及到操作系统层面的文件系统操作,通常通过编程语言实现。下面将详细介绍如何进行这项操作,并提供一些...

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

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

    遍历文件夹并建成目录树00.zip_C++目录树_文件夹 _文件夹遍历_遍历文件_遍历文件夹

    遍历文件夹并建成目录树__遍历文件夹并建成目录树

    C++各种遍历文件夹代码.pdf

    在C++编程中,遍历文件夹是一项常见的任务,它涉及到操作系统I/O操作以及文件系统的交互。本示例代码展示了如何使用C++遍历指定文件夹及其子文件夹,并找到特定类型的文件。以下是对给定代码的详细解释: 首先,...

    C++遍历文件夹目录的方法

    C++遍历文件夹目录的方法详解 C++遍历文件夹目录的方法是指在C++编程语言中,遍历文件夹目录的方法和技术。文件夹目录的遍历是指按照一定的规则和顺序,获取文件夹目录中的所有文件和子文件夹的名称和路径。C++语言...

    MFC实现遍历文件夹.zip

    在这个"MFC实现遍历文件夹"的项目中,我们将探讨如何使用MFC来遍历文件夹并处理其中的文件。 1. **文件或文件夹选择操作**: 在MFC中,通常使用`CFileDialog`类来进行文件或文件夹的选择。`CFileDialog`有打开和...

    如何遍历文件夹查找文件

    遍历文件夹就是沿着这个目录树逐级向下查找。 2. **编程语言支持**:不同的编程语言提供了不同的API(应用程序接口)来实现文件和目录操作。例如: - **Python**: 可以使用`os`和`os.path`模块,如`os.walk()`函数...

    c++遍历文件夹下文件去除文件名中的空格

    c++遍历文件夹下文件去除文件名中的空格。

    vc遍历文件夹下面的文件

    在编程领域,遍历文件夹及其子目录中的所有文件是一项常见的任务...总的来说,遍历文件夹下的文件是软件开发中的基础操作,无论是在VC++还是其他编程语言中。理解如何正确使用文件系统API是每个开发者必备的技能之一。

    遍历文件夹并构建目录树

    3. 当遍历文件夹时,对于每个子目录,创建新的`HTREEITEM`并将其插入到父节点下。 4. 可以使用`SetItemData`方法将文件夹路径等信息附加到树节点,以便后续操作。 5. 对于每个文件,也可以创建一个`HTREEITEM`,但...

Global site tag (gtag.js) - Google Analytics