首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PathFindExtensionW总是返回“。而不是完全扩展

PathFindExtensionW总是返回“。而不是完全扩展
EN

Stack Overflow用户
提问于 2018-07-20 15:02:51
回答 2查看 745关注 0票数 1

我有以下路径和文件名

代码语言:javascript
复制
"C:\\Users\\msi\\Desktop\\read-file\\read-file.sdf"

对于PathFindExtensionW函数,预期的返回字符串是".sdf",但它返回"."

这是我的code

代码语言:javascript
复制
#include <stdio.h>
#include <shlwapi.h>

#define FILENAME        "C:\\Users\\msi\\Desktop\\read-file\\read-file.sdf"                 // current file-path
#define MAX_FILE_EXT    90                                      // maximum file-extension length
#define ERR_MSG         "Cannot open the specific file!\n"  // error message if couldn't open the file

#pragma comment(lib, "shlwapi.lib")                             // add this static library for using of PathFindExtension

int main(int argc, char *argv[])
{
    WIN32_FIND_DATAW data = {0};
    HANDLE fh = 0;

    if((FindFirstFile(TEXT(FILENAME), &data)) != INVALID_HANDLE_VALUE)
    {
        WCHAR file_ext[MAX_FILE_EXT] = {0};
        lstrcpy(file_ext, PathFindExtension(TEXT(FILENAME)));

        printf("File-extension is : '%s'\n", PathFindExtensionW(TEXT(FILENAME)));
    }
    else
        printf(ERR_MSG);

    return 0;
}

顺便说一下,我使用了wchar_t*,所以我不得不打电话给PathFindExtensionW。虽然我调用了PathFindExtension,但它返回了相同的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-21 00:14:29

您的程序是Unicode (这是推荐的),您实际上不需要TEXT宏,它只在定义UNICODE时添加L前缀。你可以自己做:

代码语言:javascript
复制
const wchar_t *wstr = L"this is a wide char string"; //or const WCHAR*, same thing

PathFindExtension是一个宏,在定义UNICODE时它被定义为PathFindExtensionW

代码语言:javascript
复制
#ifdef UNICODE
#define PathFindExtension  PathFindExtensionW
#else
#define PathFindExtension  PathFindExtensionA
#endif // !UNICODE

所以你可以直接写PathFindExtension

lstrcpy副本很好,但它是一个特定于Windows的函数。新程序可以使用宽字符版本的字符串函数,wcscpy代替strcpywcslen代替strlenwcsxxx代替strxxx .

"C:\\Users\\msi\\Desktop"不应该是硬编码的。使用SHGetKnownFolderPath查找桌面路径,例如:

代码语言:javascript
复制
#include <windows.h>
#include <stdio.h>
#include <shlwapi.h>
#include <Shlobj.h>
#include <KnownFolders.h>

#pragma comment(lib, "shlwapi.lib")  

int main(void)
{
    wchar_t desktop[MAX_PATH];

    //get desktop path:
    wchar_t *ptr;
    SHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &ptr);
    wcscpy_s(desktop, _countof(desktop), ptr);
    CoTaskMemFree(ptr);

    //make filename from desktop path:
    wchar_t filename[MAX_PATH];
    swprintf(filename, _countof(filename), L"%s\\read-file\\read-file.sdf", desktop);

    if (PathFileExists(filename))
        wprintf(L"File-extension is : '%s'\n", PathFindExtension(filename));

    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2018-07-20 15:15:30

当我们打算使用printf打印一个wide-string时,我们应该使用"%ls"格式说明符,而不是"%s"

但是,将"%s"wprintf结合使用是非常好的。

这是一条规则:

代码语言:javascript
复制
WCHAR *wstr = "this is wide string";
CHAR *str = "this is string";

wprintf("%s", wstr);
printf("%ls", wstr);

printf("%s", str);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51445421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档