Увеличьте количество символов в поле имени файла в диалоге выбора файла GetOpenFileName

Наше приложение позволяет выбирать несколько файлов в диалоговом окне выбора файлов, которое отображается через функцию GetOpenFileName (этот вопрос также относится к людям, использующим CFileDialog и т. Д.)

Кажется, существует ограничение на количество символов, которые можно ввести в поле имени файла (259, кажется, магическое число - не знаю почему).

Мы попытались изменить следующие члены структуры OPENFILENAME :

lpstrFile - указывает на наш собственный буфер размером 4K байт. nMaxFile - устанавливает размер lpstrFile (мы компилируем ANSI, так что это эффективно 4000

Но эти значения, по-видимому, не увеличивают ширину ввода поля имени файла в диалоговом окне.

Я собираюсь поэкспериментировать с отправкой сообщения EM_SETLIMITTEXT элементу управления, но хотел узнать, есть ли у кого-нибудь еще решение.

РЕДАКТИРОВАТЬ - решил это сам: решение Я не могу принять свой собственный ответ, но здесь это для потомков. Если у кого-то есть лучшее решение, пожалуйста, опубликуйте его - или смело модифицируйте мое решение, чтобы будущие поисковики могли найти его наверху.

11.12.2008 23:05:24
3 ОТВЕТА

Из присвоения имени файлу или каталогу в MSDN :

В Windows API (с некоторыми исключениями, обсуждаемыми в следующих параграфах) максимальная длина пути равна MAX_PATH260 символам.

Даже если вы можете вывести более длинные строки из диалога, вы можете столкнуться с проблемами в дальнейшем при использовании API, которые были закодированы MAX_PATH.

Документы продолжают говорить:

Windows API имеет много функций, которые также имеют версии Unicode, чтобы разрешить путь расширенной длины для максимальной общей длины пути 32 767 символов. Этот тип пути состоит из компонентов, разделенных обратной косой чертой, каждая из которых соответствует значению, возвращенному в параметре lpMaximumComponentLength функции GetVolumeInformation. Чтобы указать путь расширенной длины, используйте "\\?\"префикс. Например, "\\?\D:\<very long path>". (Символы < >используются здесь для наглядности и не могут быть частью допустимой строки пути.)

2
11.12.2008 23:08:59
Обратите внимание, что я извлекаю несколько путей из диалога - каждый путь может быть длиной до MAX_PATH, но диалог может вернуть 10 или 15 из них.
Kevin Day 13.12.2008 03:23:50

Я считаю, что это жесткий предел, который нельзя обойти. Единственное время, которое должно иметь значение, это когда вы хотите выбрать более одного файла, так как ограничение достаточно для максимальной длины имени файла.

Я добавил кнопку «Все файлы» в эти диалоги для открытия всех файлов в папке; это единственный обходной путь, который я нашел.

0
11.12.2008 23:12:37
аааа - никогда не говори «никогда» в мире win32 :-)
Kevin Day 13.12.2008 03:44:10
Обычно я бы не сказал «никогда», но я потратил много времени на это.
Mark Ransom 14.12.2008 03:24:44
Очень круто, спасибо! Работа, с которой я боролся с этим, давно прошла, но я буду помнить об этом в следующий раз.
Mark Ransom 19.12.2008 20:11:05
РЕШЕНИЕ

Оказывается, что элемент управления для редактирования (по крайней мере, в моей среде разработки) представляет собой поле со списком, поэтому EM_SETLIMITTEXTон не подходит.

Вместо этого я выследил поле со списком, используя GetDlgCtrlродительский элемент диалогового окна открытия файла (я делаю это в OnInitDialogобработчике), приведу его к CComboBox*, а затем вызову, LimitText()чтобы установить предел.

Это также можно сделать, отправив CB_LIMITTEXTсообщение для элемента управления тем из вас, кто не работает с CFileDialog. Соответствующее значение здесь, скорее всего, является OPENFIILENAME.nMaxFileзначением, которое передается в.

4
3.06.2011 14:38:03