有没有简单的方法 检测字符串是不是DOS 8.3格式?

ziplj 2010-04-06 07:43:06
现在有两个字符串 比如
CPU~1.GAD
CPU.gadget

如何检测第一个字符串是不是DOS 8.3格式命名的呢
...全文
124 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2010-04-06
  • 打赏
  • 举报
回复
不错,受教了。
ziplj 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jennyvenus 的回复:]

查找是否有0或1个点,点的位置是否处于倒数第2,3,4位,前面后面是否有不可使用的字符比如*,?等等。
[/Quote]有一定的局限性 比如长的文件夹名被简写后 没有点

基本我的这个函数跑了一遍目录 没有出现断言失败 而且得到的结果也是对的
ziplj 2010-04-06
  • 打赏
  • 举报
回复
基本搞定了 发现属性里面有一个是否是DOS命名格式的属性。。。 哎 没看清楚协议 害的写了半天的检测函数基本作废
反正函数也没用了 贴上来吧

/**********************************************************************************
*函数名称: IsDOSShortName
*功能说明: 判断第二个字符串是不是简化过的字符串
*参数列表: pWchar : 第一个字符串的指针
* pWcharIsShortName : 需要判断的是不是DOS 8.3格式字符串的指针
*返 回 值: TRUE : pWcharIsShortName 是DOS文件名
* FALSE : pWcharIsShortName 不是DOS文件名
**********************************************************************************/
BOOL CMFTRecord::IsDOSShortName(WCHAR* pWchar , WCHAR* pWcharIsShortName)
{
if (wcslen(pWchar) > 12) //如果第一个文件名属性的字符串长度大于12 则肯定第二个字符串长度是8.3简化名
return TRUE;

if (wcslen(pWcharIsShortName) > 12) //如果第二个文件名属性的字符串长度大于12 则肯定第一个字符串长度是8.3简化名
return FALSE;

if (wcsstr(pWchar , L" ") != NULL) //第一个文件名属性中找到了空格 则第二个字符串肯定为8.3简化名
return TRUE;

if (wcsstr(pWcharIsShortName , L" ") != NULL) //第二个文件名属性中找到了空格 则第一个字符串肯定为8.3简化名
return FALSE;

if (GetFileNameLen(pWchar) > 8)
return TRUE;
if (GetFileExtLen(pWchar) > 4)
return TRUE;
if (GetFileNameLen(pWcharIsShortName) > 8)
return FALSE;
if (GetFileExtLen(pWcharIsShortName) > 4)
return FALSE;

//ASSERT(FALSE);
//OK 强制转换成ANSI字符串 查看第七位是不是 '~'
char szWChar[_MAX_PATH];
char szWcharIsShortName[_MAX_PATH];
memset(szWChar , 0 , _MAX_PATH);
memset(szWcharIsShortName , 0 , _MAX_PATH);

WideCharToMultiByte(CP_OEMCP , NULL , pWchar , -1 , szWChar , _MAX_PATH ,
NULL , FALSE);
WideCharToMultiByte(CP_OEMCP , NULL , pWcharIsShortName , -1 , szWcharIsShortName , _MAX_PATH ,
NULL , FALSE);

if (szWChar[6] == '~')
return FALSE;
if (szWcharIsShortName[6] == '~')
return TRUE;

//下个断言 看看有没有没有考虑到的情况
ASSERT(FALSE);
return FALSE;
}

//获取文件名长度
int CMFTRecord::GetFileNameLen(WCHAR* pWchar)
{
WCHAR wChar = '.';
WCHAR* pSubStr = wcsrchr(pWchar , wChar);
if (pSubStr != NULL)
return (int)pSubStr - (int)pWchar;
return 0;
}

//获取扩展名长度
int CMFTRecord::GetFileExtLen(WCHAR* pWchar)
{
WCHAR wChar = '.';
WCHAR* pSubStr = wcsrchr(pWchar , wChar);
if (pSubStr != NULL)
return wcslen(pSubStr) - 1;
return 0;
}


用户 昵称 2010-04-06
  • 打赏
  • 举报
回复
查找是否有0或1个点,点的位置是否处于倒数第2,3,4位,前面后面是否有不可使用的字符比如*,?等等。
hellward 2010-04-06
  • 打赏
  • 举报
回复

  8.3通常指较旧的Windows操作系统或DOS的文件命名限制
  8指文件名最大长度为8
  3指扩展名最大长度为3
你说的问题具体是什么?简单的判断文件名和后缀长度?

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧