函数的风格与版式例子

 

/*! @function

********************************************************************************

<PRE>

函数名   : GetAllSubDirs

功能     : 获得所有符合条件的子目录列表

参数     : [OUT] vResult       : 用来储存结果

           [IN]  dirPattern    : 要查找的子目录通配符

           [IN]  includeSubdir : 是否包含子目录

           [IN]  includeHidden : 是否包含隐含目录

           [IN]  includeDot    : 是否包含“.”和“..”系统目录

返回值   : 符合条件的子目录数量

抛出异常 : -

--------------------------------------------------------------------------------

备注     : 无论是否成功,vResult中的原内容都将被清空

典型用法 : -

--------------------------------------------------------------------------------

作者     : 白杨

</PRE>

*******************************************************************************/

ULONG

CDir::GetAllSubDirs(OUT VSTR&     vResult,

                    IN  tstringEx dirPattern    /*= byT("*")*/,

                    IN  bool      includeSubdir /*= false*/,

                    IN  bool      includeHidden /*= true*/,

                    IN  bool      includeDot    /*= false*/) const

{

    // =========================================================================

    // = 初始化

    vResult.clear();

    if (dirPattern.empty() || !IsValid())

    {

        return 0;

    }

 

    WIN32_FIND_DATA FindFileData;

    HANDLE hFind;

    tstringEx Pattern = m_basedir + DELIMITER + dirPattern;

 

    // =========================================================================

    // = 匹配子目录

    hFind = ::FindFirstFile(Pattern.c_str(), &FindFileData);

    if(INVALID_HANDLE_VALUE == hFind)
    {

        return 0;

    }

   
int n
;

    tstringEx stDir;

    if (-1 != (n=dirPattern.find_last_of(ALLDELIMITERS)))

    {

        stDir = m_basedir + DELIMITER + dirPattern.substr(0, n) + DELIMITER;

    }

    else

    {

        stDir = m_basedir + DELIMITER;

    }

 

    do

    {

        if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))

        {

            goto findnext;

        }

 

        if (IsDotDir(FindFileData.cFileName) && !includeDot)

        {

            goto findnext;

        }

 

        if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)

            && !includeHidden)

        {

            goto findnext;

        }

 

        // 递归搜索子目录

        if (includeSubdir && !IsDotDir(FindFileData.cFileName))

        {

            VSTR rr;

            tstringEx rdir;

            if (-1 != n)

            {

                rdir = dirPattern.substr(0, n)+DELIMITER+FindFileData.cFileName

                       +DELIMITER+dirPattern.substr(n+1, -1);

            }

            else

            {

                rdir = FindFileData.cFileName+DELIMITER+dirPattern;

            }

 

            GetAllSubDirs(rr, rdir, includeSubdir, includeHidden, includeDot);

            const ULONG count = rr.size();

            for (ULONG i=0; i<count; ++i)

            {

                vResult.push_back(rr[i]);

            }

        }  // if (includeSubdir && !IsDotDir(FindFileData.cFileName))

 

        vResult.push_back(stDir + FindFileData.cFileName);

 

findnext:

        if (!::FindNextFile(hFind, &FindFileData))

        {

            break;

        }

    } while(true);

 

    ::FindClose(hFind);

    return vResult.size();

}