You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Shell API:如何将显示文件名转换为解析文件名?

Windows Shell API:显示文件名转解析文件名(含存在性验证)

问题场景

你有外部存储设备(如示例中的Apple iPhone)上文件的解析文件名(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}

对应的用户可见显示文件名为:

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

修改扩展名后得到新的显示路径:

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

需要高效验证该文件是否存在,并获取对应的解析文件名(IDL),无需遍历目录。


可行实现方案

Windows Shell API提供了SHParseDisplayName函数,直接满足需求:

  • 该函数可以将用户可见的显示路径解析为绝对ITEMIDLIST(即你所说的IDL);
  • 如果目标文件不存在,函数会直接返回错误码,无需遍历目录;
  • 支持外部存储设备的命名空间扩展(如手机设备的Shell扩展),能正确映射显示路径到设备内部的真实IDL。

C++代码示例

#include <shlobj.h>
#include <shlwapi.h>
#include <atlbase.h>

// 将显示路径转换为绝对IDL,同时验证文件存在性
HRESULT DisplayNameToAbsoluteIDL(LPCWSTR displayPath, PIDLIST_ABSOLUTE* outPIDL)
{
    if (!displayPath || !outPIDL)
        return E_INVALIDARG;

    // SHParseDisplayName核心调用:解析路径+验证存在性
    return SHParseDisplayName(displayPath, nullptr, outPIDL, 0, nullptr);
}

// 使用示例
int main()
{
    const wchar_t* modifiedPath = L"This PC\\Apple iPhone\\Internal Storage\\202212__\\IMG_3295.JPG";
    PIDLIST_ABSOLUTE pidl = nullptr;

    HRESULT hr = DisplayNameToAbsoluteIDL(modifiedPath, &pidl);
    if (SUCCEEDED(hr))
    {
        // 文件存在,pidl即为对应的解析文件名(IDL)
        // 后续可使用pidl进行Shell操作,比如获取属性、打开文件等
        ILFree(pidl); // 必须释放IDL内存
    }
    else
    {
        // 文件不存在或解析失败,处理错误(如hr=0x80070002表示文件未找到)
    }

    return 0;
}

关键说明

  1. 内存管理:获取到的IDL必须用ILFree函数释放,避免内存泄漏;
  2. 错误处理:常见错误码包括:
    • ERROR_FILE_NOT_FOUND(0x80070002):文件不存在;
    • ERROR_PATH_NOT_FOUND(0x80070003):上级目录不存在;
  3. 兼容性:该函数支持Windows XP及以上系统,对于外部存储设备的命名空间扩展(如手机、U盘的Shell扩展),只要系统能识别设备,就能正确解析路径。

内容的提问来源于stack exchange,提问作者Jean-Milost Reymond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:25:55