그의 코드 는 대체로 다음 과 같다.static TCHAR BASEDCODE szFilter[] = _T(&TXT(*.txt)|*.txt||&); CFileDialog dlg(TRUE,_T(&txt&), NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT, szFilter, NULL ); INT_PTR nResult = dlg.DoModal();테스트 를 해 봤 는데 txt 파일 을 많이 선 택 했 을 때 그 가 말 한 것 처럼 반환 값 이 IDCANCEL 인 경우 가 있 지만 파일 이 몇 개 없 으 면 IDOK 로 돌아 갈 때 도 있 습 니 다.다 중 파일 대화 상자 에서 선택 한 파일 에 임계값 이 있다 는 뜻 입 니 다.파일 의 많 고 적 음 을 선택 하 는 것 은 문자열 버퍼 입 니 다.따라서 CFileDialog 에는 사용자 가 선택 한 파일 이름 을 저장 하 는 데 사용 할 문자열 버퍼 가 있 을 것 이 라 고 추측 합 니 다.이 버퍼 는 기본 길이 가 있 습 니 다.만약 에 선택 한 모든 파일 길이 가 기본 길 이 를 초과 하면 DoModal 함수 의 반환 값 은 IDCANCEL 입 니 다.그렇다면 다음 과 같은 문제 가 있 습 니 다.1.이 버퍼 가 존재 한다 면 CFileDialog 류 에서 어떤 데이터 구성원 이 이 버퍼 를 제어 하 는 지,이 버퍼 의 기본 길 이 는 얼마 입 니까?2.사용자 가 더 많은 파일 을 선택 할 수 있 도록 이 버퍼 의 길 이 를 어떻게 늘 립 니까?그래서 자 료 를 찾 아 봤 습 니 다.CFileDialog 류 의 초기 화 값 은 주로 m 에 집 중 됩 니 다.이 데이터 멤버 m_ofn Windows OPEnfileNAME 구조.기본 파일 대화 상자 매개 변수 에 대한 액 세 스 를 제공 합 니 다.그 중 mofn 에는 두 명의 구성원 이 파일 이름 버퍼 를 맡 고 있 습 니 다.lpstrFile 과 nMaxFile 입 니 다.lpstrFile 은 파일 이름 편집 컨트롤 을 초기 화 하 는 데 사용 할 파일 이름 을 포함 하 는 버퍼 를 가리킨다.초기 값 이 필요 하지 않 으 면 이 버퍼 의 첫 번 째 문 자 는 NULL 이 어야 합 니 다.GetOpenFileName 이나 GetSaveFileName 함수 가 되 돌 아 왔 을 때 이 버퍼 는 드라이브,경로,파일 이름,선택 한 파일 의 확장 자 를 포함 합 니 다.하면,만약,만약...ALLOWMULTISELECT 태그 가 설정 되 어 있 고 사용자 가 여러 개의 파일 을 선 택 했 습 니 다.버퍼 는 현재 디 렉 터 리 에서 선 택 된 파일 의 이름 을 포함 합 니 다.Explorer 스타일 대화 상자 에 대해 디 렉 터 리 와 파일 이름 문자열 은 NULL 로 나 뉘 어 있 으 며,파일 이름 뒤에 추가 NULL 이 있 습 니 다.이전 스타일 대화 상자 에 대해 문자열 은 빈 칸 으로 나 뉘 어 있 으 며 함 수 는 빈 칸 이 있 는 파일 이름 으로 짧 은 파일 이름 을 사용 합 니 다.FindFirst File 함 수 를 사용 하여 장단 파일 이름 사 이 를 변환 할 수 있 습 니 다.사용자 가 파일 하나만 선택 하면 lpstrFile 문자열 은 경로 와 파일 이름 사이 에 구분 되 지 않 습 니 다.버퍼 가 너무 작 으 면 함수 가 FALSE 로 돌아 가 고 CommDlgExtended Error 함수 가 FNERR 로 돌아 갑 니 다.BUFFERTOOSMALL.。그렇다면 lpstrFile 버퍼 의 우선 두 바이트 에는 필요 한 크기(바이트 나 문자)가 포함 되 어 있 습 니 다.nMaxFile 은 lpstrFile 버퍼 의 크기 를 TCHARs 단위 로 지정 합 니 다.ANSI 버 전에 대해 서 는 바이트 의 개수 입 니 다.유 니 코드 버 전에 대해 서 는 문자 의 개수 입 니 다.이 버퍼 는 끝 에 있 는 null 문 자 를 포함 하여 경로 와 파일 이름 문자열 을 충분히 저장 해 야 합 니 다.버퍼 가 너무 작 으 면 GetOpenFileName 과 GetSaveFileName 함수 가 가짜(FALSE)버퍼 를 최소 256 글자 로 되 돌려 줍 니 다.디 버 깅 관찰 을 통 해 나 는 nMaxFile 의 초기 값 이 260 이라는 것 을 발견 했다.그러나 나 는 프로그램 을 써 서 이 버퍼 의 기본 시간 을 테스트 하 였 으 나,이 초기 값 과 모순 되 었 다.내 테스트 방법 은 이렇다.먼저 E 디스크 에 Txt Data 폴 더 를 만 든 다음 빈 txt 파일 40 개 를 만 듭 니 다.생 성 코드 는 다음 과 같 습 니 다:for(int i=0;i<40;i++) { CString strName = _T(&&); strName.Format(_T(&E:Txt Data%d.txt&),i); CreateFile(strName, // file to open GENERIC_READ, // open for reading FILE_SHARE_READ, // share for reading NULL, // default security CREATE_NEW, // existing file only FILE_ATTRIBUTE_NORMAL, // normal file NULL); // no attr.template}그리고 여러 번 시 도 를 통 해 0.txt,1.txt,2.xtxt,27.txt(총 28 개 파일)를 선택 할 때 DoModal 함수 의 반환 값 은 IDOK 이지 만 0.txt,1.txt,2.xtxt,27.txt,28.txt(총 29 개 파일)를 선택 할 때 DoModal 함수 의 반환 값 은 IDCANCEL 입 니 다.이어서 나 는 선택 한 파일 의 총 길 이 를 계산 했다.(유 니 코드 문자 집합 에서 컴 파일):CString strAllFiles=T(&&); for (int i = 0;i<28;i++) { CString strName = _T(&&); strName.Format(_T(&E:Txt Data%d.txt&),i); strAllFiles = strAllFiles + strName; } int nStrLen = strAllFiles.GetLength();nStrLen 의 반환 값 은 494 입 니 다.28.txt 를 추가 하면:CString strAllFiles=T(&&); for (int i = 0;i<29;i++) { CString strName = _T(&&); strName.Format(_T(&E:Txt Data%d.txt&),i); strAllFiles = strAllFiles + strName; } int nStrLen = strAllFiles.GetLength();nStrLen 의 반환 값 은 512 입 니 다.다 중 바이트 문자 집합 에서 도 이 수치 입 니 다.여기 서 주의해 야 할 것 은 CString::GetLength()는 ASCII 에 대해 문자열 이 차지 하 는 바이트 의 수 를 되 돌려 줍 니 다.그러나 유 니 코드 라면 바이트 수가 아 닌 문자 수 를 되 돌려 줍 니 다.그러면 저 는 그 버퍼 의 기본 크기 가 제 가 디 버 깅 해서 관찰 한 260 이 아니 라 512 라 고 초보 적 으로 단정 합 니 다.처음에 그 문 제 를 어떻게 해결 하 는 지 에 대해 서 는 더 큰 버퍼 를 정의 하고 lpstrFile 을 이 버퍼 에 가리 키 며 nMaxFile 의 값 을 재 설정 하면 됩 니 다.구체 적 으로 는 TCHAR sz LargeBuf[4096];/임시 버퍼 memset(sz LargeBuf,'0',4096)을 정의 합 니 다. static TCHAR BASED_CODE szFilter[] = _T(&TXT(*.txt)|*.txt||&); CFileDialog dlg(TRUE,_T(&txt&), NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT, szFilter, NULL ); dlg.m_ofn.lpstrFile = szLargeBuf; #ifdef UNICODE dlg.m_ofn.nMaxFile = 4096; #else dlg.m_ofn.nMaxFile = sizeof (szLargeBuf);\#endif 는 여러 파일 을 읽 으 려 고 하지만 항상 최대 8 개의 파일 을 읽 습 니 다.8 개가 넘 으 면 읽 을 수 없습니다.정지점 검 사 를 통 해 8 개의 파일 을 읽 으 려 면 if(dlgOpen->DoModal()=IDOK)로 프로그램 이 실 행 됩 니 다.어쩐지!그런데 도대체 어떻게 여러 파일 을 읽 을 수 있 습 니까?함수 에 판단 문 이 있 음 발견 DWORD nOffset=lstrlen(mofn.lpstrFile)+1; ASSERT(nOffset <= m_ofn.nMaxFile);한편,nMaxFile 의 최대 파일 수 는 구조 함수 에서 비어 있 습 니 다.nMaxFile 의 값 을 지정 하지 않 으 면 판단 문 구 는 반드시 DoModal 함수 에서 튀 어 나 옵 니 다.그래서 나 는 if(dlgOpen->DoModal()=IDOK)앞에서 아래 문장 CString str 를 쓴다.dlgOpen->m_ofn.lpstrFile=str.GetBuffer(100000); str.ReleaseBuffer(); dlgOpen->m_ofn.nMaxFile = 5000;다 됐어!하지만 기억 하 세 요.mofn 은 보이 지 않 지만,쓰 면 틀 리 지 않 습 니 다.CFileDialog 는 파일 다 중 선택 을 어떻게 실현 합 니까? CFileDialog 클래스 설정 OFNALLOWMULTISELECT 플래그 는 파일 다 중 선택 기능 을 수행 할 수 있 지만,파일 의 수 는 제한 되 어 있 으 며,이 제한 을 돌파 하려 면 스스로 버퍼 를 제공 해 야 합 니 다.예:CString fileExtensions="jpg 파일(*.jpg)|*.jpg|"; CFileDialog fileDlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT | OFN_ENABLESIZING | OFN_HIDEREADONLY, fileExtensions);const int MIN_FILE_NUMBER = 10; //최소 10 개의 파일 을 선택 할 수 있 습 니 다 fileDlg.mofn.lpstrFile = new TCHAR[_MAX_PATH * MIN_FILE_NUMBER]; //버퍼 크기 다시 정의 memset(fileDlg.m_ofn.lpstrFile, 0, _MAX_PATH * MIN_FILE_NUMBER); //정 의 된 버퍼 파일 Dlg.m 초기 화ofn.nMaxFile = _MAX_PATH * MIN_FILE_NUMBER;if (IDOK == fileDlg.DoModal()){ POSITION pos = fileDlg.GetStartPosition(); while (NULL != pos) { TRACE(fileDlg.GetNextPathName(pos)); //파일 이름 가 져 오기 //파일 사용... } }delete[] fileDlg.m_ofn.lpstrFile; //마지막 으로 메모리 방출 잊 지 마 세 요.