增加 GetOpenFileName 文件选择对话框的文件名字段中的字符数

Posted

技术标签:

【中文标题】增加 GetOpenFileName 文件选择对话框的文件名字段中的字符数【英文标题】:Increase number of characters in filename field of GetOpenFileName file selection dialog 【发布时间】:2008-12-11 23:05:24 【问题描述】:

我们的应用程序允许在通过 GetOpenFileName 函数显示的文件选择对话框中选择多个文件(这个问题也适用于使用 CFileDialog 等的人...)

可以在文件名字段中输入的字符数似乎是有限的(259 似乎是一个神奇的数字 - 不知道为什么)。

我们已尝试更改OPENFILENAME 结构的以下成员:

lpstrFile - 指向我们自己的缓冲区,大小为 4K 字节 nMaxFile - 设置为 lpstrFile 的大小(我们正在编译 ANSI,所以这实际上是 4000

但这些值似乎不会增加对话框中文件名字段的输入宽度。

我将尝试向控件发送 EM_SETLIMITTEXT 消息,但想知道其他人是否有解决方案。

编辑 - 自己解决了这个问题:solution 我不能接受我自己的答案,但这是为了后代。如果其他人有更好的解决方案,请发布 - 或者随时修改我的解决方案,以便未来的搜索者可以在顶部找到它。

【问题讨论】:

【参考方案1】:

原来编辑控件(至少在我的开发环境中)是一个组合框,所以EM_SETLIMITTEXT 不合适。

相反,我在文件打开对话框的父级上使用GetDlgCtrl 跟踪组合框(我在OnInitDialog 处理程序中执行此操作),将其转换为CComboBox*,然后调用LimitText() 来设置限制。

这也可以通过向控件发送CB_LIMITTEXT 消息来完成,供那些不使用CFileDialog 的人使用。这里的适当值很可能是传入的OPENFIILENAME.nMaxFile 值。

【讨论】:

【参考方案2】:

来自Naming a File or Directory on MSDN:

在 Windows API 中(以下段落中讨论了一些例外情况),路径的最大长度为 MAX_PATH,定义为 260 个字符。

即使您可以强制从对话框中取出更长的字符串,但在使用针对 MAX_PATH 编码的 API 时,您可能会遇到麻烦。

文档继续说:

Windows API 有很多功能 也有 Unicode 版本 允许一个扩展长度的路径 最大总路径长度为 32,767 人物。这种类型的路径是 由分开的组件组成 反斜杠,每个最大的值 在返回 lpMaximumComponentLength 参数的 GetVolumeInformation 函数。到 指定一个扩展长度的路径,使用 "\\?\" 前缀。例如, "\\?\D:\<very long path>"。 (这 字符 < > 在这里用于 视觉清晰度,不能成为 有效的路径字符串。)

【讨论】:

请注意,我正在从对话框中检索多个路径 - 每个路径可能与 MAX_PATH 一样长,但对话框可能返回其中的 10 或 15 个。【参考方案3】:

我相信这是一个无法绕过的硬性限制。唯一重要的是当您要选择多个文件时,因为该限制足以满足最大文件名长度。

我在这些对话框中添加了一个“所有文件”按钮,用于打开文件夹中的所有文件;这是我找到的唯一解决方法。

【讨论】:

啊——在 win32 的世界里永远不要说“从不”:-) 通常我不会说“从不”,但我花了很多时间。 非常酷,谢谢!我为此苦苦挣扎的工作早已不复存在,但下次我会记住它。

以上是关于增加 GetOpenFileName 文件选择对话框的文件名字段中的字符数的主要内容,如果未能解决你的问题,请参考以下文章

Qt5_选择文件对话框

QFileDialog文件对话框

getOpenFileName 上的进度条

GetOpenFileName函数未打开对话框

GetOpenFileName 选择文件夹的解决方法

QT 对话框