windows - 文件名超过 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
?而且,如果是这样,我可以使用任何解决方法吗?
解决方案
我读了一些关于这个问题的案例。找到这篇文章:.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 失败。
推荐阅读
- kubernetes - kubernetes:当pod处于CrashLoopBackOff状态时,相关事件不会更新?
- python - 如何添加两个不同维度的数据框?
- javascript - React Native Modal 背景无法正常工作
- gradle - Gradle 构建冻结在地址注册表日志上
- python - 将列表转换为数组时 round() 的问题
- multiprocessing - MPI_IO write_all 子数组和组件号
- java - 在将 java 对象转换为 yaml 文件时,它还添加了对象名称
- c# - C# Winforms 软件部署 (setup.exe) 后数据库连接会发生什么?
- javascript - 无法使用 laravel 查看 MAC OS 中的时隙
- javascript - 在 react-router 中从类组件路由到功能组件时更新 document.location.pathname