在Visual C++中没有像Delphi中提供的系统函数来实现这些功能。为了方便程序开发,笔者设计了一个CPath类,用于对文件名称进行处理。实例设计步骤如下:
(1)创建一个控制台应用程序。
(2)定义一个CPath类,向该类中添加3个静态方法,分别用于获取文件名、扩展名和包含扩展名的文件名。
class CPath
{
public:
//从包含完整路径的文件名称中去除路径,包含文件扩展名
static bool GetFileName(char szSrcFile[], int nSrcLen, char szDesFile[], int nDesLen);
//获取文件的扩展名
static bool GetExtName(char szSrcFile[], int nSrcLen, char szDesFile[], int nDesLen);
//获取文件名,去除路径和扩展名
static bool GetFileShortName(char szSrcFile[], int nSrcLen, char szDesFile[], int nDesLen);
};
bool CPath::GetFileName(char szSrcFile[], int nSrcLen, char szDesFile[], int nDesLen)
{
//反向查找'\'符号
char *pdest = strrchr(szSrcFile, '\\');
if (pdest != NULL)
{
int nFileLen = strlen(szSrcFile) - strlen(pdest);
if (nFileLen < nDesLen - 1)
{
strncpy(szDesFile, ++pdest, nFileLen);
return true;
}
}
return false;
}
bool CPath::GetExtName(char szSrcFile[], int nSrcLen, char szDesFile[], int nDesLen)
{
//反向查找'.'符号
char *pdest = strrchr(szSrcFile, '.');
if (pdest != NULL)
{
int nSubLen = strlen(pdest);
if (nSubLen < nDesLen - 1)
{
strcpy(szDesFile, pdest);
return true;
}
}
return false;
}
bool CPath::GetFileShortName(char szSrcFile[], int nSrcLen, char szDesFile[], int nDesLen)
{
//反向查找'\'符号
char *pdest = strrchr(szSrcFile, '\\');
if (pdest != NULL)
{
char *pDot = strrchr(szSrcFile, '.');
int nFileLen = strlen(szSrcFile) - strlen(pdest);
if (pDot != NULL)
{
nFileLen = pDot - pdest - 1;
}
if (nFileLen < nDesLen - 1)
{
strncpy(szDesFile, ++pdest, nFileLen);
return true;
}
}
return false;
}
(3)在main函数中调用CPath类的GetExtName方法 获取扩展名、调用GetFileShortName方法获取文件名,调用GetFileName方法获取包含扩展名的文件名。
int main(int argc, char* argv[])
{
cout << "完整名称为:" << *argv << endl;
char szDesFile[128] = {0};
bool bRet = CPath::GetExtName(*argv, strlen(*argv), szDesFile, 128); //获取扩展名
if (bRet)
{
cout << "扩展名为:" << szDesFile << endl; //输出扩展名
}
char szShortName[128] = {0};
bRet = CPath::GetFileShortName(*argv, strlen(*argv), szShortName, 128); //获取短文件名
if (bRet)
{
cout << "短文件名:" << szShortName << endl; //输出信息
}
char szFileName[128] = {0};
bRet = CPath::GetFileName(*argv, strlen(*argv), szFileName, 128); //获取文件名
if (bRet)
{
cout << "文件名:" << szFileName << endl; //输出信息
}
return 0;
}