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

时间:2015-07-27 06:33:14

标签: c++ winapi

我需要从filename获取扩展名并将其与我的扩展数组进行比较。但看起来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吗?因为这种类型有很多麻烦。他们什么时候练习?

3 个答案:

答案 0 :(得分:5)

您可以使用PathFindExtension Windows API函数(因为您显然是使用已发布的代码编写Windows代码)。这是shlwapi.dll,因此您需要#include <shlwapi.h>并将项目与shlwapi.lib相关联。

它返回指向文件扩展名开头的'.'的指针,因此您只需将此指针传递给字符串比较函数_wcsicmp即可进行比较。

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

答案 1 :(得分:3)

  1. 此功能有TCHAR个版本:tcsstr;
  2. TCHAR已经过时,使用char/wchar_t,甚至更好 - std::string/std::wstring;
  3. 文件名可能包含许多.个符号,因此使用字符串搜索例程似乎有点矫枉过正。只需在字符串中找到最后一个点,并将字符串指针增加到其索引。您将获得具有文件扩展名的子字符串。

答案 2 :(得分:2)

create table foo (id number, str varchar2(10));
create table bar (id number, num number);

insert all
into foo(id, str) values(1, 'foo one')
into foo(id, str) values(2, 'foo two')
into bar(id, num) values(1, 100)
into bar(id, num) values(2, 200)
select 1 from dual;

select foo.id, foo.str as foo_str, bar.num as bar_num
from foo
inner join bar on bar.id = foo.id
;

或使用Windows API PathFindExtension

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

有关使用TCHAR的信息,请参阅this 简短:不要使用它。