关于FINDFIRSTFILE的问题

最近在写一个MFC 程序时发现了一个问题:

查找文件使用使用FindFirstFILE 查找时 查找条件是:????09*.rld

返回文件名称:

TEST0953382.rld

TEST1007291.rld

发现TEST1007291.rld 不符合 条件但是也显示了出来后来分析发现:

这个文件的WIN32_FIND_DATA结构中返回的文件名称

是TEST1007291.rld 但是她的8.3格式的文件名称是TEST09`1.rld也是符合查找条件的文件名称的。乡里好久没想到这么俺长文件名称进行查找 来屏蔽这种情况。

于是想了个笨办法。获取长文件名称后在对这个文件名称字符串 按照查找条件进行一下模糊比对,比对算法是网上找的如下:



//功  能:带通配符的字符串匹配
//参  数:lpszSour是一个普通字符串;
//  lpszMatch是一可以包含通配符的字符串;
//  bMatchCase为0,不区分大小写,否则区分大小写。
//返  回  值:匹配,返回1;否则返回0。
//通配符意义:
// ‘*’ 代表任意字符串,包括空字符串;
// ‘?’ 代表任意一个字符,不能为空;
//时  间: 2001.11.02 13:00
bool MatchingString(const char* lpszSour, const char* lpszMatch, bool bMatchCase /*  = true */)
{
// ASSERT(AfxIsValidString(lpszSour) && AfxIsValidString(lpszMatch));
if(lpszSour == NULL || lpszMatch == NULL)
return false;


if(lpszMatch[0] == 0)//Is a empty string
{
if(lpszSour[0] == 0)
return true;
else
return false;
}


int i = 0, j = 0;


//生成比较用临时源字符串'szSource'
char* szSource =
new char[ (j = strlen(lpszSour)+1) ];


if( bMatchCase )
{ //memcpy(szSource, lpszSour, j);
while( *(szSource+i) = *(lpszSour+i++) );
}
else
{ //Lowercase 'lpszSour' to 'szSource'
i = 0;
while(lpszSour[i])
{ if(lpszSour[i] >= 'A' && lpszSour[i] <= 'Z')
szSource[i] = lpszSour[i] - 'A' + 'a';
else
szSource[i] = lpszSour[i];


i++;
}
szSource[i] = 0;
}


//生成比较用临时匹配字符串'szMatcher'
char* szMatcher = new char[strlen(lpszMatch)+1];


//把lpszMatch里面连续的“*”并成一个“*”后复制到szMatcher中
i = j = 0;
while(lpszMatch[i])
{
szMatcher[j++] = (!bMatchCase) ?
( (lpszMatch[i] >= 'A' && lpszMatch[i] <= 'Z') ?//Lowercase lpszMatch[i] to szMatcher[j]
lpszMatch[i] - 'A' + 'a' :
lpszMatch[i]
) :
lpszMatch[i]; //Copy lpszMatch[i] to szMatcher[j]
//Merge '*'
if(lpszMatch[i] == '*')
while(lpszMatch[++i] == '*');
else
i++;
}
szMatcher[j] = 0;


//开始进行匹配检查


int nMatchOffset, nSourOffset;


bool bIsMatched = true;
nMatchOffset = nSourOffset = 0;
while(szMatcher[nMatchOffset])
{
if(szMatcher[nMatchOffset] == '*')
{
if(szMatcher[nMatchOffset+1] == 0)
{ //szMatcher[nMatchOffset]是最后一个字符


bIsMatched = true;
break;
}
else
{ //szMatcher[nMatchOffset+1]只能是'?'或普通字符


int nSubOffset = nMatchOffset+1;


while(szMatcher[nSubOffset])
{ if(szMatcher[nSubOffset] == '*')
break;
nSubOffset++;
}


if( strlen(szSource+nSourOffset) <
size_t(nSubOffset-nMatchOffset-1) )
{ //源字符串剩下的长度小于匹配串剩下要求长度
bIsMatched = false; //判定不匹配
break; //退出
}


if(!szMatcher[nSubOffset])//nSubOffset is point to ender of 'szMatcher'
{ //检查剩下部分字符是否一一匹配


nSubOffset--;
int nTempSourOffset = strlen(szSource)-1;
//从后向前进行匹配
while(szMatcher[nSubOffset] != '*')
{
if(szMatcher[nSubOffset] == '?')
;
else
{ if(szMatcher[nSubOffset] != szSource[nTempSourOffset])
{ bIsMatched = false;
break;
}
}
nSubOffset--;
nTempSourOffset--;
}
break;
}
else//szMatcher[nSubOffset] == '*'
{ nSubOffset -= nMatchOffset;


char* szTempFinder = new char[nSubOffset];
nSubOffset--;
memcpy(szTempFinder, szMatcher+nMatchOffset+1, nSubOffset);
szTempFinder[nSubOffset] = 0;


int nPos = ::FindingString(szSource+nSourOffset, szTempFinder, 0);
delete []szTempFinder;


if(nPos != -1)//在'szSource+nSourOffset'中找到szTempFinder
{ nMatchOffset += nSubOffset;
nSourOffset += (nPos+nSubOffset-1);
}
else
{ bIsMatched = false;
break;
}
}
}
} //end of "if(szMatcher[nMatchOffset] == '*')"
else if(szMatcher[nMatchOffset] == '?')
{
if(!szSource[nSourOffset])
{ bIsMatched = false;
break;
}
if(!szMatcher[nMatchOffset+1] && szSource[nSourOffset+1])
{ //如果szMatcher[nMatchOffset]是最后一个字符,
//且szSource[nSourOffset]不是最后一个字符
bIsMatched = false;
break;
}
nMatchOffset++;
nSourOffset++;
}
else//szMatcher[nMatchOffset]为常规字符
{
if(szSource[nSourOffset] != szMatcher[nMatchOffset])
{ bIsMatched = false;
break;
}
if(!szMatcher[nMatchOffset+1] && szSource[nSourOffset+1])
{ bIsMatched = false;
break;
}
nMatchOffset++;
nSourOffset++;
}
}


delete []szSource;
delete []szMatcher;
return bIsMatched;
}

要是你看完岁这种情况有什么好的处理方法请指教谢谢!

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

今天早上有和同事讨论了一下这个问题在她的系统上使用同样的函数就没有这个问题。

后来分析得出 我昨天的系统分区是FAT32格式 他的分区是NTFS格式又或者是系统配置补丁的问题。造成相同的函数返回结果不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值