Почему CFileDialog :: GetNextPathName не работает, когда путь к файлу длинный?

С помощью CFileDialog класс, я выбираю несколько файлов, помещенных в каталог с длинным путем. Это нормально, когда я выбираю только один или два файла; но когда я выбираю три файла одновременно, он возвращает только часть третьего пути к файлу. (Похоже, он ограничен 512 символами) Как я могу решить эту проблему?

6

Решение

MFC использует стандартный размер буфера _MAX_PATH и именно поэтому вы видите такое поведение. смотреть на dlgfile.cpp для реализации CFileDialog::CFileDialog и ты увидишь m_ofn.lpstrFile а также m_ofn.nMaxFile быть установленным

Вы можете указать больший буфер, если хотите. Перед звонком DoModal Вы можете получить доступ к CFileDialog::m_pOFN член, чтобы получить указатель на OPENFILENAME что CFileDialog будет использовать и обновлять его напрямую или позвонить CFileDialog::GetOFN чтобы получить ссылку на структуру и обновить ее.

В любом случае вы найдете это полезным: http://msdn.microsoft.com/en-US/library/ms646839(v=vs.80).aspx

5

Другие решения

Предполагая, что ваш код выглядит примерно так:

CFileDialog dialog(...);
dialog.DoModal();

Определите максимальное количество файлов, которые вы хотите поддерживать, например:

#define MAX_FILE_NAMES 256

Добавьте это перед звонком DoModal:

CString data;
dialog.m_pOFN->nMaxFile = (MAX_FILE_NAMES*(MAX_PATH+1))+1;
dialog.m_pOFN->lpstrFile = data.GetBuffer((MAX_FILE_NAMES*(MAX_PATH+1))+1);

Добавьте это после звонка DoModal:

data.ReleaseBuffer();
0