从TCHAR数组中获取文件扩展名

Get file extension from TCHAR array?

本文关键字:文件 扩展名 获取 TCHAR 数组      更新时间:2023-10-16

我需要从文件名获得扩展名,并将其与扩展名数组进行比较。但是看起来TCHAR没有strpos()类似的功能,所以我正在行走TCHAR的数组(不是最好的解决方案?)来搜索'.'符号并提取文件扩展名。但是它不工作。

for (int i = 0; i < extCount; i++)
{
    //wsprintf(fileName, L"%d", extCount);
    //_tcscpy_s(fileName, extensions[i]);
    _tcscpy_s(fileName, fileData.cFileName);
    for (int k = wcslen(fileName); k >= 0; k--)
    {
        if (fileName[k] == (LPCWSTR)TCHAR('.'))
        {
            wsprintf(temp, L"%c", fileName[k]);
            MessageBox(NULL, fileName[k], L"Файл", MB_OK);
        }
    }

那么问题是,如何以最简单和最有效的方式获取和比较文件扩展名?另一个问题是,我真的应该用TCHAR吗?因为这种类型有很多麻烦。他们什么时候练习?

您可以使用PathFindExtension Windows API函数(因为您显然是从您发布的代码为Windows编码)。这是在shlwapi.dll,所以你需要#include <shlwapi.h>和链接你的项目与shlwapi.lib

它返回一个指向文件扩展名开头的'.'的指针,所以你可以把这个指针传递给像_wcsicmp这样的字符串比较函数来比较它。

顺便说一下,TCHAR是一个宏,扩展到charwchar_t,具体取决于您的项目是为ANSI还是Unicode构建的。它不是一个类,也没有方法,TCHAR数组只是一个字符数组。

  1. 此功能有TCHAR版本:tcsstr;
  2. TCHAR是相当过时的东西,使用char/wchar_t,或者更好- std::string/std::wstring代替;
  3. 文件名可能包含许多.符号,因此使用字符串搜索例程似乎是多余的。简单地定位最后一个点在你的字符串和增量字符串指针到它的索引。您将获得具有文件扩展名的子字符串。
std::wstring GetLastExtension(const std::wstring &fileName)
{
    auto pos = fileName.rfind(L".");
    if (pos == std::wstring::npos)
        pos = -1;
    return std::wstring(fileName.begin() + pos, fileName.end());
}

或者使用Windows API PathFindExtension

如何比较- std::wstring::compare

查看有关使用TCHAR的信息。
短:不要用