首页 > 解决方案 > 文件名超过 MAX_PATH(260 个字符)的 Windows ShellExecuteW

问题描述

我正在努力了解可能导致我的问题的原因。

我在用

ShellExecuteW('open', 'explorer.exe', '/select,[file_name]', None, win32con.SW_SHOW)

我要做的是在操作系统中打开文件,突出显示它,然后将文件资源管理器带到前台。这在大多数情况下都可以正常工作,但是当我尝试打开超过MAX_PATH限制(260 个字符)的文件时,该文件不会打开,而是将我带到“我的文件”页面。

我尝试在文件名的开头添加“\\?\”,因为这是其他 Stack Overflow 帖子所说的关于覆盖MAX_PATH限制的内容,但它并没有改变这种情况。

ShellExecuteW功能是否不允许超过 的文件MAX_PATH?而且,如果是这样,我可以使用任何解决方法吗?

标签: windowswinapifilesystemsshellexecute

解决方案


我读了一些关于这个问题的案例。找到这篇文章:.NET 中的长路径,第 1 部分,共 3 部分 [Kim Hamilton]

如果您在文件名前加上“\?\”并调用 Windows API 的 Unicode 版本,那么您可以使用最长 32K 个字符的文件名。换句话说,\?\ 前缀是一种在使用 Windows 文件 API 时启用长路径的方法。

和:

带有 \?\ 前缀的长路径可用于大多数与文件相关的 Windows API,但并非所有 Windows API。

我也测试ShellExcuteW\\?\,它失败了。与SHOpenFolderAndSelectItems

CoInitialize(NULL);

    LPCWSTR file_name ;//Change the path according to your needs

    PIDLIST_ABSOLUTE pidl;
    if (SUCCEEDED(SHParseDisplayName(file_name, 0, &pidl, 0, 0)))
    {
        ITEMIDLIST idNull = { 0 };
        LPCITEMIDLIST pidlNull[1] = { &idNull };
        SHOpenFolderAndSelectItems(pidl, 1, pidlNull, 0);
        ILFree(pidl);
    }

注意:在使用 SHOpenFolderAndSelectItems 之前必须调用 CoInitialize 或 CoInitializeEx。不这样做会导致 SHOpenFolderAndSelectItems 失败。


推荐阅读