C++ 我可以使GetOpenFileName返回路径比MAX_路径长吗?
我正在使用API,或者在我的例子中,使用MFC的CFileDialog来打开文件,就像它一样(除了一个文件选择——即,我在C++ 我可以使GetOpenFileName返回路径比MAX_路径长吗?,c++,winapi,mfc,C++,Winapi,Mfc,我正在使用API,或者在我的例子中,使用MFC的CFileDialog来打开文件,就像它一样(除了一个文件选择——即,我在m_of n.lpstrFile中提供了我自己的较长缓冲区) 它可以正常工作,除非用户选择的文件路径超过MAX\u path-1(或259)个字符。在这种情况下,会发生以下情况: 在我的Windows 8.1上,它将用户选择的路径转换为古老的8.3短文件格式:“C:\TESTDE~1\NEWFOL~1” 在Windows XP上,我甚至无法选择任何内容,我得到以下信息:
m_of n.lpstrFile
中提供了我自己的较长缓冲区)
它可以正常工作,除非用户选择的文件路径超过MAX\u path-1
(或259)个字符。在这种情况下,会发生以下情况:
- 在我的Windows 8.1上,它将用户选择的路径转换为古老的8.3短文件格式:
“C:\TESTDE~1\NEWFOL~1”
- 在Windows XP上,我甚至无法选择任何内容,我得到以下信息:
所以我很好奇,既然操作系统本身支持长的Unicode路径,前缀是
\\?\
(包括XP),那么有没有办法诱使GetOpenFileName以该格式返回路径,而不受259个字符的限制?Windows文件对话框,甚至是新的VistaIFileDialog
,返回的文件名长度不会超过MAX\u PATH
您是否使用了N_LONGNAMES的?@MariusBancila:OFN_LONGNAMES
仅适用于旧式对话框以关闭8.3文件名。它不允许对话框使用“\\?”。\\?\
仅适用于低级文件I\O函数,如CreateFile()
。它不适用于更高级别的API,如Shell接口和对话框。这是Shell和相关对话框的实现者所做的选择。他们可能选择允许这些对话框返回转义文件名,这似乎是合理的。但他们没有。我想总结一下:“shell和文件系统有不同的要求。可以使用Windows API创建一个shell用户界面无法正确解释的路径”<代码>\\?\
仅适用于文件系统,不适用于UI。当然,UI实现者可以支持语法,但他们不支持。不同层次的编程。层次不在其中。他们只是选择不支持“\\?”。Windows 10 insider版本现在有一个组策略,允许>MAX\u路径,即使没有\\?\前缀,并且Explorer将支持它们,因此在某个时候事情会发生变化。。。