C++ 中读取文件夹中所有文件的几种方式与实现

来到公司实习之后,代码就从之前的为了功能而写代码改为从设计出发写代码。

最近在做一个文件读取的功能,需求很简单:读取某个文件夹内所有的文件。

那么,首当其冲要面临的问题,就是列举所有文件。

经过一系列选择之后,我选择了以下的方法:

事情过去的太久远了,好多步骤也忘记了。以后想到什么要马上写下来记录才行。

int KG_GetChildDirPath(const wchar_t *pcszDirectory, KG_FILE_LIST *pFileList)
{
    int nResult = false;
    int nRetCode = false;
    wchar_t szFindDirectory[MAX_PATH];
    wchar_t szChildDirectory[MAX_PATH];
    wchar_t szResultDirectory[MAX_PATH];

    HANDLE hFile= 0;
    WIN32_FIND_DATA FindData;
    wchar_t *pszTempPath = NULL;

    KG_ASSERT_EXIT(pcszDirectory);
    KG_ASSERT_EXIT(pFileList);

    ZeroMemory(szFindDirectory, sizeof(szFindDirectory));
    ZeroMemory(szChildDirectory, sizeof(szChildDirectory));
    ZeroMemory(szResultDirectory, sizeof(szResultDirectory));

    nRetCode = swprintf(
        szFindDirectory, countof(szFindDirectory), L"%ls/*.*", pcszDirectory
    );
    KG_PROCESS_ERROR(nRetCode > 0 && nRetCode < countof(szFindDirectory) - 1);

    nRetCode = swprintf(
        szResultDirectory, countof(szResultDirectory), L"%ls", pcszDirectory
    );
    KG_PROCESS_ERROR(nRetCode > 0 && nRetCode < countof(szResultDirectory) - 1);

    hFile= FindFirstFile(szFindDirectory, &FindData);
    KG_PROCESS_ERROR(hFile != INVALID_HANDLE_VALUE);

    for (;;)
    {
        nRetCode = FindNextFile(hFile, &FindData);
        //KG_PROCESS_ERROR(nRetCode);

        // Is the last file
        if (!nRetCode) 
            break; 

        //Ignore "." and ".."
        if (FindData.cFileName[0] == '.' && 
            FindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
        {
            if (FindData.cFileName[1] == '\0' || 
                (FindData.cFileName[1] == '.' &&FindData.cFileName[2] == '\0'))
                continue;
        }

        // Find a directory
        if(FindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
        {
            nRetCode = swprintf(
                szChildDirectory, 
                countof(szChildDirectory), 
                L"%s/%s", 
                pcszDirectory, 
                FindData.cFileName
            );
            KG_PROCESS_ERROR(nRetCode > 0 && nRetCode < countof(szChildDirectory) - 1);

            //Recursive
            nRetCode = KG_GetChildDirPath(szChildDirectory, pFileList);
            KG_PROCESS_ERROR(nRetCode);
            continue;
        }

        //Push the filename to the list
        pszTempPath = new wchar_t[KG_STRING_LEN];
        KG_PROCESS_ERROR(pszTempPath);

        nRetCode = swprintf(
            pszTempPath, 
            KG_STRING_LEN, 
            L"%ls/%ls", 
            szResultDirectory, 
            FindData.cFileName
        );
        KG_PROCESS_ERROR(nRetCode > 0 && nRetCode < KG_STRING_LEN - 1);

        pFileList->push_back(pszTempPath);
    }

    nResult = true;
Exit0:
    if (!nResult)
        KG_DELETE_ARRAY(pszTempPath);

    return nResult;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值