2008-12-11 2 views
4

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

Похоже, что количество символов, которые могут быть введены в поле имени файла, ограничено (259 - это магическое число - не знаете почему).

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

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

но эти ценности, по всей видимости, не увеличение ширины ввода поля имени файла в диалоговом окне.

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

EDIT - решил это сам: solution Я не могу принять свой собственный ответ, но вот он для потомков. Если у кого-то еще есть лучшее решение, пожалуйста, напишите об этом - или не стесняйтесь модифицировать мое решение, чтобы будущие поисковики находили его наверху.

ответ

4

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

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

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

1

От Naming a File or Directory on MSDN:

В API Windows (с некоторыми исключениями, описанных в следующих пунктах), максимальная длина пути составляет MAX_PATH, который определяется как 260 символов.

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

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

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

+1

Обратите внимание, что я извлекаю несколько путей из диалога - каждый путь может быть до тех пор, пока MAX_PATH, но диалог может вернуть 10 или 15 из них. – 2008-12-13 03:23:50

0

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

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

+0

ahhh - никогда не говори «никогда» в мире win32 :-) – 2008-12-13 03:44:10

Смежные вопросы