2013-02-15 4 views
6

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?

+0

Czy to ma coś wspólnego z oknem w 'MAX_PATH'? – bames53

+0

Ma to na celu użycie MFC domyślnie przy użyciu bufora o rozmiarze '_MAX_PATH'. Można go przesłonić. –

Odpowiedz

5

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

+1

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. –

+0

Dzięki. Twój opis oraz link działały dla mnie. ;) – Javid

0

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();