2013-02-15 4 views
6

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

+0

ли это сделать с окна 'MAX_PATH'? – bames53

+0

Он имеет отношение к MFC, используя буфер размером '_MAX_PATH' по умолчанию. Это можно переоценить. –

ответ

5

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

+1

Если вы столкнулись с проблемой работы с ним, вы также можете рассмотреть возможность использования диалоговых окон [Common Item Dialogs] (http://msdn.microsoft.com/en-US/library/bb776913.aspx) вместо. API-интерфейс GetOpenFileName был устаревшим с выпуском Vista, но по-прежнему поддерживается для устаревших приложений. –

+0

Спасибо. Ваше описание, а также ссылка работали для меня. ;) – Javid

0

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

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(); 
Смежные вопросы