递归枚举目录内的文件、读取文本文件内的行内容

本文介绍了一个用于Windows环境下递归枚举指定目录及其子目录中所有文件的方法,并提供了一个实用函数来逐行读取文本文件内容。通过C++实现,展示了如何使用Windows API进行文件操作。
#include <windows.h>
#include <vector>
#include <string>
using namespace std;

// 枚举指定目录(包括其中的所有子目录)中的所有文件
int RecursiveEnumFile(const char* szDir, vector<string>& vFileNameList)
{
    char szQuestContext[MAX_PATH];
    strcpy(szQuestContext, szDir);
    strcat(szQuestContext, "\\*.*");

    WIN32_FIND_DATA cWin32FindData;
    HANDLE hHandle = FindFirstFile(szQuestContext, &cWin32FindData);
    if ( hHandle != INVALID_HANDLE_VALUE )
    {
        do
        {
            if ( 0 != strcmp(cWin32FindData.cFileName, ".") && 0 != strcmp(cWin32FindData.cFileName, "..") )
            {
                if ( (cWin32FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) != 0 )
                {
                    char szNextLevelDir[MAX_PATH];
                    strcpy(szNextLevelDir, szDir);
                    strcat(szNextLevelDir, "\\");
                    strcat(szNextLevelDir, cWin32FindData.cFileName);
                    RecursiveEnumFile(szNextLevelDir, vFileNameList);
                }
                else
                {
                    char szFullFileName[MAX_PATH];
                    strcpy(szFullFileName, szDir);
                    strcat(szFullFileName, "\\");
                    strcat(szFullFileName, cWin32FindData.cFileName);
                    vFileNameList.push_back(szFullFileName);
                }
            }

        } while ( FindNextFile(hHandle, &cWin32FindData) );

        FindClose(hHandle);

        return 0;
    }
    else
    {
        return -1;
    }
}

// 读取文本文件中的每一行的内容(注:该文本文件的最后应该加上一个回车换行符)
int ReadFileLine(const char* szFileName, vector<string>& vFileLine)
{
    const int MAX_LINE_LEN = 512;  // 单行所允许的最大长度
    char szLineBuf[MAX_LINE_LEN];
    FILE *fp = fopen(szFileName, "rb");
    if ( fp )
    {
        while ( NULL != fgets(szLineBuf, sizeof(szLineBuf), fp) )
        {
            szLineBuf[strlen(szLineBuf)-2] = '\0';  // 去掉szLineBuf最后的“\r\n”
            vFileLine.push_back(szLineBuf);
        }

        fclose(fp);
        return 0;
    }
    else
    {
        return -1;
    }
}

// demo
int main(void)
{
    vector<string> vFileLine;
    if ( 0 == ReadFileLine(".\\test.txt", vFileLine) )
    {
        for ( int i=0; i<(int)vFileLine.size(); ++i )
        {
            printf("[%s]\n", vFileLine[i].c_str());
        }

        printf("count:[%d]\n", vFileLine.size());
    }

    printf("=====================================================\n");

    vector<string> vFileNameList;
    if ( 0 == RecursiveEnumFile(".\\test", vFileNameList) )
    {
        for ( int i=0; i<(int)vFileNameList.size(); ++i )
        {
            printf("[%s]\n", vFileNameList[i].c_str());
        }

        printf("count:[%d]\n", vFileNameList.size());
    }

    getchar();
    return 0;
}


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值