转一老外的算法,不错很好用,多重扩展名也可以处理,例如 aaa.doc.bak
// --- 使用示范 -------------------
if ( FilenameMatch("*.exe", "filename.exe") == 1 )
{
// filename.exe 匹配 *.exe 结构
}
else
{
// 不匹配
}
// --- 函数实现如下 -------------------
int FilenameMatch(char *pat, char *name)
{
int match,ndone;
char *cpp,*cpn;
cpp = pat;
cpn = name;
match = 1;
ndone = 1;
while (ndone)
{
switch (*cpp)
{
case '*':
// skip to next letter
cpp++;
// skip to next letter
cpn = strchr(cpn, *cpp);
if(cpn==NULL)
{
cpn = name;
while (*cpn)
cpn++;
}
break;
case '?':
cpp++;
cpn++;
break;
case 0:
if (*cpn != 0)
match = 0;
ndone = 0;
break;
default:
if (tolower(*cpp) == tolower(*cpn))
{
cpp++;
cpn++;
}
else
{
match = 0;
ndone = 0;
}
break;
}
}
return(match);
if ( true )
{
}
else
{
}
}
// --- 使用示范 -------------------
if ( FilenameMatch("*.exe", "filename.exe") == 1 )
{
// filename.exe 匹配 *.exe 结构
}
else
{
// 不匹配
}
// --- 函数实现如下 -------------------
int FilenameMatch(char *pat, char *name)
{
int match,ndone;
char *cpp,*cpn;
cpp = pat;
cpn = name;
match = 1;
ndone = 1;
while (ndone)
{
switch (*cpp)
{
case '*':
// skip to next letter
cpp++;
// skip to next letter
cpn = strchr(cpn, *cpp);
if(cpn==NULL)
{
cpn = name;
while (*cpn)
cpn++;
}
break;
case '?':
cpp++;
cpn++;
break;
case 0:
if (*cpn != 0)
match = 0;
ndone = 0;
break;
default:
if (tolower(*cpp) == tolower(*cpn))
{
cpp++;
cpn++;
}
else
{
match = 0;
ndone = 0;
}
break;
}
}
return(match);
if ( true )
{
}
else
{
}
}