본문 바로가기
C & C++/C & C++

CFileDialog(파일 선택,저장,파일명,경로 읽기)

by izen8 2011. 4. 26.
반응형

원형CFileDialog   ( BOOL bOpenFileDialog,
                      LPCTSTR lpszDefExt = NULL,
                      LPCTSTR lpszFileName = NULL,
                      DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
                      LPCTSTR lpszFilter = NULL,
                      CWnd* pParentWnd = NULL );
 인자값 설명 bOpenFileDialog    TRUE면 파일열기, false 면 파일 저장
lpszDefExt            파일 확장자로 선언이 되면 해당하는 확장자를 가진 파일만 나온다.
lpszFileName        파일명 에디트 박스에 초기화될 파일명
dwFlags(*1)          dialog box 기본 FLAG, m_ofn.Flags에 등록된다
lpszFilter              연속된 문자열으로 파일 확장자를 원하는 타입으로 나오게 할수 있다
pParentWnd           다이얼로그 소유 윈도우 포인터

 

dwFlage 설명
(*1) dwFlags
OFN_NOCHANGEDIR             디렉토리변경불가
OFN_HIDEREADONLY            읽기전용파일은 숨김
OFN_OVERWRITEPROMPT   존재하는 파일 덮어쓰기전에 확인하기
OFN_FILEMUSTEXIST           반드시 존재하는 파일명만 입력받음
OFN_ALLOWMULTISELECT   다중선택가능
OFN_ENABLESIZING             파일열기 대화상자의 크기 조절가능
 - 사용예

 

예)
CFileDialog templatefileDialog( TRUE, "txt", "sample.txt",
                                               OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //dwFlags
                                               "텍스트(*.txt)|*.txt|모든파일(*.*)|*.*||" );                // lpszFilter  1. 그림 파일 선택하고 파일 경로 와 파일명 받기

 

CString dirdir;
CString m_filename;
CString m_filedir;

 

CFileDialog fileDlg(TRUE, NULL, NULL, OFN_EXPLORER | OFN_HIDEREADONLY,
L"파일 선택(*.bmp, *.jpg) | *.bmp; *.jpg");

 

int iReturn = fileDlg.DoModal();if(iReturn == IDOK)

      m_filename=fileDlg.GetFileName();      // 파일명 받기
      m_filedir=fileDlg.GetPathName();       // 경로 받기

 

      m_3DRun.m_DEffect.SetTexture(m_filedir); //함수로 CString 넘기기 }

 

TIP - fileDlg.DoModal 을 쓰고 나면 경로가 마지막으로 썼던 곳으로 바꿔져있기때문에 MFC 에서 연결된 곳에서 파일을 사용하면 이상한곳으로 날라갈수 있다 그럴때는 GetCurrentDirectory 와  SetCurrentDirectory 을 사용해서 파일을 저장하는 곳의 위치를 와 저장할 곳의 위치를 바꿔주면 된다.

 

 

 

2.파일 저장하기

 

ds 라는 확장자를 가진것으로 예시 코드를 만들어 보겠다.

 

저장 버튼
void Dialog1::OnBnClickedButtonSave()
{
 


 //옵션 선택 부분.
   if(dlgFileSave.DoModal() == IDOK)
   {
        vector::iterator EffectItr;
        EffectItr = DTool.m_DEffect.m_Effect.begin();

     

        CString Temp;

        Temp.Format(L"%s%s",dlgFileSave.GetFileName(),L".ds");

       

        HANDLE  hFile;
        DWORD  dwRead;

  

        //파일저장 시작 
        hFile = CreateFile(Temp,GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);
 

 
        //애니메이션 관련 정보 저장 

WriteFile(hFile, &EffectItr[m_nEffectListSelect].AniControl.m_TGaro, sizeof(int), &dwRead, NULL);
WriteFile(hFile, &EffectItr[m_nEffectListSelect].AniControl.m_TSaro, sizeof(int), &dwRead, NULL);

CloseHandle(hFile);

 

 

}

// 초기 폴더 지정

CfileDialog dlg()

dlg.m_ofn.lpstrInitialDir = "위치지정";

//플래그 와 함수

출처 - 열이 Blog |열이(shine10ee) http://shine10ee.blog.me/10049051176

플래그

 

 

OFN_EXPLORER  윈도우 탐색기 스타일
OFN_EXPLORER            다중 파일 선택
OFN_CREATEPROMPT            새 파일명을 입력 시 메시지 박스 출력 
OFN_FILEMUSTEXIST            존재 하지 않는 파일명 입력 불가
OFN_HIDEREADONLY            읽기 전용파일 출력 불가
OFN_LONGNAMES                긴 파일이름 포맷 지원
OFN_OVERWRITEPROMPT        존재하는 파일명 입력 시 메시지 박스 출력
OFN_PATHMUSTEXIST          존재 하는 디렉터리명만 입력

 

 

OFN_ALLOWMULTISELECT  : 여러개 선택

 

 

 

 함수

 

CString GetPathName() 선택된 파일의 절대 경로
CString GetFileName() 선택된 파일의 파일명과 확장자
CString GetFileExt() 선택된 파일의 확장자
CString GetFileTitle() 선택된 파일의 파일명
BOOL GetReadOnlyPref() 읽기 전용 여부
POSITION GetStartPosition() 다중 선택의 경우
CString GetNextPathName()

 

 

 

TIP - 여러개의 파일을 선택했을때

 

char fileBuffer[10000] = {0};
fileDlg.m_ofn.lpstrFile = fileBuffer;
fileDlg.m_ofn.nMaxFile = sizeof(fileBuffer);
if(fileDlg.Domodal() == IDOK)
{

 

POSITION pos = fileDlg.GetStartPosition();while(pos != NULL)
{
 CString filepath = fileDlg.GetNextPathName(pos);
 AfxGetApp()->OpenDocumentFile(filepath);
}
}

 

TIP2 -OFN_NOCHANGEDIR             디렉토리변경불가

을 사용하지 않으면 세이브나 로드할떄 마지막으로 선택된 디렉토리가

사용되기떄문에 상대경로를 못쓴다. 이점을 잘 생각하면서 코딩하자


파일 선택을 위한 클래스가 CFileDialog 이다.

 

 

한개의 파일만 선택할 경우

char szFilter[] = "Image (*.BMP, *.GIF, *.JPG) | *.BMP;*.GIF;*.JPG | All Files(*.*)|*.*||";

CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);

if(IDOK == dlg.DoModal()) {

CString strPathName = dlg.GetPathName();

}

 

 

여러개의 파일을 복수 선택할 경우

 

dwFlag에 OFN_ALLOWMULTISELECT 설정한다.

선택된 여러 파일 리스트가 저장될 버퍼가 제공되야 한다.

만일 기본 버퍼 이상의 파일을 선택해 확인 버튼을 누른다면,

DoModal을 실행시켰을 때, IDCANCEL이 리턴되고, 파일 리스트가 넘어오지 않을 것이다.

 

char szFilter[] = "All Files(*.*) | *.* ||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, szFiilter);

dlg.m_ofn.lpstrInitialDir = _T("D:/"); // 오픈할때 초기 경로 지정
// 여기서 버퍼 크기 늘려줘야 함.

char strFile[4096] = { 0, }; CString fileName;
dlg.m_ofn.lpstrFile = strFile; dlg.m_ofn.lpstrFile = fileName.GetBuffer( 4096 );
dlg.m_ofn.nMaxFile = sizeof(strFile); dlg.m_ofn.nMaxFile = 4096

if (IDOK == dlg.DoModal()) { 
for (POSITION pos=dlg.GetStartPosition(); pos != NULL;) 
CString strPathName =
 dlg.GetNextPathName(pos);
}

 

 

파일 선택 필터

static TCHAR BASED_CODE szFilter[] = 

 _T("Chart Files (*.xlc)|*.xlc|") _T("Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|") 

 _T("*.xlc; *.xls|All Files (*.*)|*.*||"); 

 

 

 

예제

void CMyClass::OnFileOpen() { // szFilters is a text string that includes two file name filters: // "*.my" for "MyType Files" and "*.*' for "All Files." TCHAR szFilters[]= _T("MyType Files (*.my)|*.my|All Files (*.*)|*.*||"); // Create an Open dialog; the default file name extension is ".my". CFileDialog fileDlg(TRUE, _T("my"), _T("*.my"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters); // Display the file dialog. When user clicks OK, fileDlg.DoModal() // returns IDOK. if (fileDlg.DoModal() == IDOK) { CString pathName = fileDlg.GetPathName(); // Implement opening and reading file in here. // Change the window's title to the opened file's title. CString fileName = fileDlg.GetFileTitle(); SetWindowText(fileName); } }

============================================================================

 

CFileDialog dlgFile(TRUE);


CString fileName;
const int c_cMaxFiles = 100;
const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;


dlgFile.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize);
dlgFile.GetOFN().nMaxFile = c_cMaxFiles;

 

dlgFile.DoModal();


fileName.ReleaseBuffer();

 

 

============================================================================

 

 

CFileDialog::CFileDialog

 

 

 

explicit CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL, DWORD dwSize = 0, BOOL bVistaStyle = TRUE );

 

 

BOOL bOpenFileDialog
생성하는 다이얼로그 박스 타입을 지정해 주는 매개변수
TRUE => 파일열기 다이얼로그 박스 
FALSE => 파일 저장 다이얼로그 박스

LPCTSTR lpszDefExt
기본 파일 확장자명(저장할 경우 사용)
만약 유저가 파일이름 상자 안에 확장자를 포함하지 않는 경우
lpszDefExt의 파일 확장자명을 자동으로 지정 함
NULL => 확장자명을 추가하지 않음

lpszFileName
시작할 때 파일이름 상자에 나타낼 이름 지정
NULL => 시작할 때 파일이름을 나타내지 않음

 

 

dwFlags
하나이상의 플래그를 사용하여 사용자가 원하는 다이얼로그 박스로 조합

많이 사용되는 플래그 
OFN_ALLOWMULTISELECT 한번에 여러개의 파일들을 선택 가능하게 함
OFN_CREATEPROMPT 존재하지 않는 파일명을 입력했을 경우 새로 생성하겠냐는 대화상자 표시
OFN_EXPLOPER 열기나 저장하기를 윈도우 탐색기 스타일로 출력
OFN_FILEMUSTEXIST 기존에 존재하는 파일 이름만 입력할 수 있도록 함
OFN_HIDEREADONLY 읽기전용 파일은 출력하지 않음
OFN_LONGNAMES 긴 파일 이름을 사용할 수 있도록 함
OFN_OVERWRITEPROMPT 저장할려고 하는 파일명이 존재할 경우 덮어쓰겠냐는 대화 상자 표시
OFN_PATHMUSTEXIST 오직 유효한 경로나 파일명만을 입력(아님 경고 메세지 출력)

추가 플래그 참조 : 

http://msdn.microsoft.com/ko-kr/library/ms646839(en-us,VS.85).aspx


lpszFilter
사용할 파일들이 걸러지도록 파일명들을 연속으로 나열 함

pParentWnd
부모나 소유자 윈도우의 파일 다이얼로그 박스의 포인터

dwSize
OPENFILENAME 구조체의 크기

반응형

'C & C++ > C & C++' 카테고리의 다른 글

[Tip] UpDate 체크 프로그램  (0) 2011.04.27
CString 변수값 숫자여부 판별  (0) 2011.04.27
[Tip] ESC 로 종료 안되게  (0) 2011.04.25
[API] 윈도우 관련 함수와 메시지  (0) 2011.04.25
API 대화상자  (0) 2011.04.25

댓글