可控制遍历深度的文件搜索类

.H 文件
//---------------------------------------------------------------------------

#ifndef SearchFilesUnitH
#define SearchFilesUnitH
//---------------------------------------------------------------------------

#include <windows.h>
#include <stdio.h>

typedef void(__stdcall *PSEARCHCALLBACK)(LPCTSTR);
typedef void(__stdcall *PDIRCOMPLETEDCALLBACK)(LPCTSTR);

class CSearchFile
{
public:
    // 无深度初始化构造函数,此时扫描深度不受限制
    CSearchFile()
    {
        m_depthLevel = -1;
    }
    
    // 扫描深度初始化构造函数
    CSearchFile(int depthLevel)
    {
        m_depthLevel = depthLevel;
    }
private:
    int m_depthLevel;

private:
    BOOL DirectoryExist(LPCTSTR lpszDir)
    {
        DWORD dwAttribute = ::GetFileAttributes(lpszDir);
        if (dwAttribute != 0xFFFFFFFF)
        {
            return ((dwAttribute & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
        }
        return FALSE;
    }
public:
    BOOL SearchFile(
            LPCTSTR root                                    /* 搜索文件的根目录 */
            , PSEARCHCALLBACK pFoundCallback                /* 文件搜到后的 Callback
                                                            在此Callback中可以实现
                                                            文件类型的过滤,文件删除,复制等等
                                                            与文件相关的操作
                                                            */
            , PDIRCOMPLETEDCALLBACK pDirCompletedCallback   /* 完成一个子目录后的 Callback
                                                            在此Callback中可以配合上个Callback
                                                            的文件删除功能,删除文件夹
                                                            */
            , int depthLevel = 0
            );
};
#endif
.cpp 文件
//---------------------------------------------------------------------------
#include "SearchFilesUnit.h"
//---------------------------------------------------------------------------


BOOL CSearchFile::SearchFile(
                        LPCTSTR root                                    /* 搜索文件的根目录 */
                        , PSEARCHCALLBACK pFoundCallback                /* 文件搜到后的 Callback
                                                                        在此Callback中可以实现
                                                                        文件类型的过滤,文件删除,复制等等
                                                                        与文件相关的操作
                                                                        */
                        , PDIRCOMPLETEDCALLBACK pDirCompletedCallback   /* 完成一个子目录后的 Callback
                                                                        在此Callback中可以配合上个Callback
                                                                        的文件删除功能,删除文件夹
                                                                        */
                        , int depthLevel
                        )
{
    char szPath[MAX_PATH] = {0};
    WIN32_FIND_DATA stWFD;
    memset(&stWFD, 0, sizeof(WIN32_FIND_DATA));
    sprintf(szPath, "%s\\*", root);
    
    // 如果有扫描深度控制
    if (m_depthLevel > 0)
    {
        if (depthLevel++ > m_depthLevel)
        {
            depthLevel = 0;
            return FALSE;
        }
    }

    HANDLE file = ::FindFirstFile(szPath, &stWFD);

    if (INVALID_HANDLE_VALUE == file) return FALSE;

    do
    {
        if (strcmp(stWFD.cFileName, ".") && strcmp(stWFD.cFileName, ".."))
        {
            char szFoundFile[MAX_PATH] = { 0 };
            sprintf(szFoundFile, "%s\\%s", root, stWFD.cFileName);


            // 判断是目录还是文件
            if (DirectoryExist(szFoundFile))
            {
                SearchFile(szFoundFile, pFoundCallback, pDirCompletedCallback, depthLevel);
            }
            if (NULL != pFoundCallback)
            {
                pCallback(szFoundFile);
            }
        }

    }while (::FindNextFile(file, &stWFD));
        
    ::FindClose(file);
        
    if (NULL != pDirCompletedCallback)
    {
        pDirCompletedCallback(root);
    }
    return TRUE;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值