C++ - Shell API - 有没有办法将解析的文件名转换为显示文件名,反之亦然?

问题描述 投票:0回答:1

在 Windows Shell API 中,有没有办法将 解析的文件名 转换为 显示文件名,反之亦然?

例如,我有一个位于外部存储上的 IDL,解析为以下解析名称:

::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_05ac&pid_12a8&mi_00#7&1a2090a1&0&0000#{6ac27878-a6fa-4155-ba85-f98f491d4f33}\SID-{10004,Internal Storage,64000000000}\{00000250-0000-0000-5002-000000000000}\{000002A2-0000-0000-A202-000000000000}

我可以从同一个 IDL 获取以下显示名称:

This PC\Apple iPhone\Internal Storage\202212__\IMG_3295.MOV

现在我想替换上面的扩展:

This PC\Apple iPhone\Internal Storage\202212__\IMG_3295.JPG

并检查我的外部存储中是否存在修改后的文件名,如果存在,则获取匹配的文件IDL。最好的方法是有一个函数,如果文件存在,则将显示名称转换为有效的解析名称,如果文件不存在,则返回错误。

考虑到性能很重要,有没有办法做到这一点,如果可能的话,以简单的方式(例如,不在打开的文件迭代器中进行迭代)?

windows shell file filenames
1个回答
0
投票
  1. 您需要通过解析名称创建 shell 项。
  2. 从 shell 项获取显示名称

这是伪代码

IShellItem* pItem = nullptr;
hr = SHCreateItemFromParsingName(L"MyParsingPATH\\PARSING_NAME", NULL, IID_PPV_ARGS(&pItem));
if (SUCCEEDED(hr)) 
{
    LPWSTR pDisplayName = nullptr;
    hr = pItem->GetDisplayName(SIGDN_NORMALDISPLAY, &pDisplayName);
    if (SUCCEEDED(hr)) 
    {
       // ...
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.