如何在VS 2010中使用GetExtension

时间:2015-01-30 16:18:31

标签: c++ c

我是c / c ++的初学者,找到this获取文件的后缀,this获取文件的名称,我有使用这些方法,但我无法在这些页面中运行示例

这是我的功能

void Myfunc(char* filename)
{   
    cout<<GetExtension(filename);
}

错误是&#34; GetExtension&#34;未定义

请帮我获取文件后缀和名称:)

谢谢

1 个答案:

答案 0 :(得分:2)

有很多方法可以从路径名中获取扩展名。

一种方法是使用shlwapi.dll中的功能。您正在寻找的功能是PathFindExtensionA

以下代码假定您使用的是Visual Studio:

#include <shlwapi.h>
#include <iostream>
#pragma comment(lib,"shlwapi.lib")

//...
void Myfunc(char* filename)
{   
    std::cout << PathFindExtensionA(filename);
}

int main()
{
    Myfunc("TestFile.exe");
}

使用PathFindExtensionA的原因是您使用ANSI(char *)文件名。

请参阅以下链接: https://msdn.microsoft.com/en-us/library/bb773587%28VS.85%29.aspx

基本上,PathFindExtension使用TCHAR作为字符类型。根据Visual Studio项目的构建设置(同样,我假设您正在使用Visual Studio),构建将是MBCS构建或Unicode构建。因此,除非您的字符串类型是TCHAR数组,否则您无法可靠地调用PathFindExtension,除非您知道要用于调用的标准字符类型。

如果构建为UnicodePathFindExtension将使用宽字符串,因此您要使用的指针类型为wchar_t*而不是char*。如果构建为MBCS,则指针类型为char*而不是wchar_t*。是的,它让人感到困惑,但这就是它的归结。

因此,为了确保使用正确的函数,无论构建类型如何,您都可以为PathFindExtensionA调用char*,或为PathFindExtensionW调用wchar_t*

如今,MBCS构建越来越少,因为Windows默认采用Unicode,所以我的建议是假设Unicode并使用宽字符串。

原始错误的原因是,PathFindExtension返回的是wchar_t*,而不是char*,其中显示的是打印的十六进制数字而不是扩展名。由于std::cout的运算符<<对字符串数据如何处理wchar_t*一无所知,因此唯一的另一个选择是输出指针值(十六进制)值得你去看看。