C语言实现的获取某目录及其子目录下所有文件的绝对路径,该怎么处理

C语言实现的获取某目录及其子目录下所有文件的绝对路径
这个是查找文件的主要的函数,如果文件夹的目录深度较浅,运行的时候没啥问题,如果太深,可能就会提示:
debug error,DAMAGE: after normal block (#55) at 0x.......
这个错误。我测试的时候,目录深度达到10级,待查找到差不多7/8千个文件的时候会提示上面的这个错误。
我不知该怎么改进这个程序了,或者,根本我的设计思路不太合理,请求达人给予指导。
完成后我会贴出所有的代码。
我设计这个小程序的主要用途为以下几点:
(1)能够遍历指定目录及其子目录下的所有文件,获取文件的修改时间;
(2)将获取到的文件的绝对路径输出到指定的文件中;
(3)能过滤指定的类型的文件;
(4)能过滤指定的文件夹;
当然,我看了DOS下的dir命令足以实现上面的这些要求,但是在我实现我的这个小程序之前,我还没意识使用DOS命令,既然已经做出来了,就干脆完善它。


C/C++ code

/**************************************************************
** 这个函数用于输出某个文件的绝对路径名。本函数会发生重入。
** pparent            : 上一级路径名,如"D:\\TestDir\\dir-A"
** pself                : 当前文件夹名,如"dir-B"
** pfileflt            : 过滤文件类型,如"*.mp3;*.mp4;*.obj"
** fileopposite    : 是否只查找pfileflt以外的所有文件
** pfldflt            : 过滤文件夹,如"folderA;folderB;"
** fldopposite    : 是否只查找pfldflt以外的所有文件夹
** pout                    : 输出文件,文件句柄
** ref                    : 参考类型,即是否比给定的时间新或旧
*/
static void GetFileFullPathName(char *pparent, char *pself, 
                                char *pfileflt, int fileopposite, 
                                char *pfldflt, int fldopposite, 
                                FILE *pout, 
                                FILE_COMPARE_TYPE ref)
{
    FINDDATA_T finddata;
    long findhandle = INVALID_HANDLE;
    char *tobefind = NULL;
    int  leng = 0;

    leng = strlen(pparent) + 3;
    if(pself != NULL)
        leng += strlen(pself);

    /*这里使用malloc申请内存,而且使用free释放内存,需要注意的是,这个函数时递归调用的,
    **系统执行时可能会不断的申请内存,如果申请的内存过小,会导致运行时出错:
    **debug error,DAMAGE: after normal block (#55) at 0x.......
    **适当增大malloc的内存,可以解决这个问题。
    **当然这个问题也可能是由于使用strcat这类的函数导致了数组越界,内存溢出而引发的。
    */
    leng = leng > FILE_NAME_STRING_LENGTH ? leng : FILE_NAME_STRING_LENGTH;

    tobefind = (char*)malloc(leng);
    if(tobefind != NULL)
    {
        memset((void*)tobefind, 0, leng);
        if(pself == NULL)
            sprintf(tobefind, "%s\\*.*", pparent);
        else
            sprintf(tobefind, "%s\\%s\\*.*", pparent, pself);

        findhandle = _findfirst(tobefind, &finddata);
        if(findhandle != INVALID_HANDLE)
        {
            while(1)
            {
                if((finddata.attrib & _A_SUBDIR) && (finddata.name[0] != '.'))
                {
                    memset((void*)tobefind, 0, leng);
                    if(pself == NULL)
                        sprintf(tobefind, "%s", pparent);
                    else
                        sprintf(tobefind, "%s\\%s", pparent, pself);
                    
                    if(fldopposite ^ IsCurrentFolderNameFit(pfldflt, finddata.name))
                    {
                        //这里开始递归调用
                        GetFileFullPathName(tobefind, 
                            finddata.name[0]=='\0'?NULL:finddata.name, 
                            pfileflt, 
                            fileopposite,
                            pfldflt,
                            fldopposite,
                            pout, 
                            ref);
                    }
                }
                else if(!(finddata.attrib & _A_SUBDIR))
                {
                    if(fileopposite ^ IsCurrentFileExtendNameFit(pfileflt, finddata.name))
                    {
                        if(pself == NULL)
                        {
                            //是否记录当前文件的绝对路径
                            if(pout != NULL && IsRecordFilePathFullName(finddata.time_write, file_time_ref, ref)) 
                            {    
                                fprintf(pout, "%s\\%s\r\n", pparent, finddata.name);
                            }
                        }
                        else
                        {
                            //是否记录当前文件的绝对路径
                            if(pout != NULL && IsRecordFilePathFullName(finddata.time_write, file_time_ref, ref)) 
                            {
                                fprintf(pout, "%s\\%s\\%s\r\n", pparent, pself, finddata.name);
                            }
                        }
                    }
                }

                if(_findnext(findhandle, &finddata) == INVALID_HANDLE)
                    break;
            }
            _findclose(findhandle);
        }

        free(tobefind);
    }
}