簡單的文件匹配(查找文件時)

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

 
功能:在查找文件時調用匹配 

輸入參數:

  @cfilename: 需要匹配的文件名
  @ckey: 匹配關鍵字(正則表達式)
    1、 * 格式(字符串匹配)
    2、 ?格式(單個字符匹配)

    (注意,此關鍵字中不含有連續的'*')
   @bflag: 是否忽略大小寫 

返回值: true 匹配成功, false 不匹配
*******************************/
bool MatchKey( const char* cfilename, const char* ckey, bool bflag )
{
    bool bMatched = false;

    char key[36] = "";
    char filename[MAX_PATH] = "";
    strncpy( key, ckey,36 );
    strncpy( filename, cfilename, MAX_PATH);


    if ( bflag )
    {
        strupr( key );
        strupr( filename);
    }
    //特殊關鍵字匹配
    if ( 0 == strcmp( key, "*" ) )
    {
        //printf("%s -- %s 匹配/n", filename, key);
        return true;
    }
    else if ( 0 == strcmp( key, "*?" )
           || 0 == strcmp( key, "?*" ) )
    {
        if ( strlen(filename) > 0 )
        {
            //printf("%s -- %s 匹配/n", filename, key);
            return true;
        }
        else
        {
            //printf("%s -- %s 不匹配/n", filename, key);
            return false;
        }
    }
    else if ( 0 == strcmp( key, "?*?" )
           || 0 == strcmp( key, "*??" ) )
    {
        if ( strlen(filename) > 1 )
        {
            //printf("%s -- %s 匹配/n", filename, key);
            return true;
        }
        else
        {
            //printf("%s -- %s 不匹配/n", filename, key);
            return false;
        }
    } 

    ///普通匹配
    const char* pname = filename;
    const char* pkey = key;

    while( *pname && *pkey )
    {
        if ( *pkey == '*' )
        {
            pkey++;
            if ( !*pkey )
            {
                bMatched = true;
                break;
            }
        }
        else if ( *pkey == '?' )
        {
            pkey++;
            pname++;
        }
        else if ( *pkey == *pname )
        {
            pkey++;
            pname++;
        }
        else
        {
            if ( *(pkey-1) == '*' )
            {
                pname++;
            }
            else
            {
                break;
            }
        }

        // 判斷下一個的狀況
        //匹配完畢
        if ( ( !*pname && !*pkey ) )
        {
            bMatched = true;
            break;
        }


        if ( !*pname || !*pkey ) //是否有一個爲末尾
        {
            break;
        }
    }
    /////打印匹配信息
    //{
    //    char* info = NULL;
    //    if ( bMatched )
    //        info = "匹配";
    //    else
    //        info = "不匹配";

    //    printf( "%s -- %s : %s /n", filename, key, info );
    //}

    return bMatched;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章