Za pomocą klasy CFileDialog
wybieram wiele plików umieszczonych w katalogu o długiej ścieżce. Jest OK, gdy wybieram tylko jeden lub dwa pliki; ale gdy wybiorę trzy pliki w tym samym czasie, zwraca tylko część trzeciej ścieżki pliku. (Wygląda na to, że jest ograniczona do 512 znaków) Jak mogę to rozwiązać?Dlaczego CFileDialog :: GetNextPathName nie działa, gdy ścieżka pliku jest długa?
Odpowiedz
MFC używa domyślnego bufora o rozmiarze _MAX_PATH
i dlatego widzisz to zachowanie. Spójrz na dlgfile.cpp
dla implementacji CFileDialog::CFileDialog
, a zobaczysz, że ustawiono m_ofn.lpstrFile
i m_ofn.nMaxFile
.
Możesz określić większy bufor, jeśli chcesz. Przed wywołaniem DoModal
można uzyskać dostęp do elementu CFileDialog::m_pOFN
, aby uzyskać wskaźnik do OPENFILENAME
, którego użyje CFileDialog
i zaktualizować go bezpośrednio lub zadzwonić pod numer CFileDialog::GetOFN
, aby uzyskać odniesienie do struktury i zaktualizować.
Albo sposób znajdziesz to pomocne: http://msdn.microsoft.com/en-US/library/ms646839(v=vs.80).aspx
Jeśli masz zamiar zadać sobie trud obejścia tego, możesz również rozważyć użycie [Common Item Dialogs] (http://msdn.microsoft.com/en-US/library/bb776913.aspx) zamiast. Interfejs API 'GetOpenFileName' był przestarzały w wydaniu Vista, ale nadal jest obsługiwany w przypadku starszych aplikacji. –
Dzięki. Twój opis oraz link działały dla mnie. ;) – Javid
Zakładając, że Twój kod wygląda mniej więcej tak:
CFileDialog dialog(...);
dialog.DoModal();
określić maksymalną liczbę plików, które chcesz wspierać, na przykład :
#define MAX_FILE_NAMES 256
Dodaj to przed wywołaniem 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);
Dodaj to po wywołaniu DoModal
:
data.ReleaseBuffer();
Czy to ma coś wspólnego z oknem w 'MAX_PATH'? – bames53
Ma to na celu użycie MFC domyślnie przy użyciu bufora o rozmiarze '_MAX_PATH'. Można go przesłonić. –