MFC 폴더 생성 방법
- C++/MFC
- 2018. 7. 10. 16:35
[MFC] 폴더 생성 방법
이번 포스팅에서는 MFC 환경에서 폴더를 생성하는 방법에 대해서 알아보도록 하겠습니다.
실제 실무에서는 프로젝트를 하면서 해당 프로그램의 정보들을 남기기 위해 여러 경로를 설정하여 해당 Directory에 폴더들을 생성해 그 안에 파일을 만들어 정보를 기록하는 경우가 많습니다.
여기서 유용하게 사용할 수 있는 것이 바로 폴더 생성입니다.
그럼 지금부터 폴더 생성 방법에 대하여 간단히 알아보도록 하겠습니다.
우선 대화상자 기반으로 MFC 프로젝트를 생성해 주시기 바랍니다.
그리고 stdafx.h, stdafx.cpp안의 코드를 아래와 같이 작성해 주시기 바랍니다.
[stdafx.h]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// stdafx.h : 자주 사용하지만 자주 변경되지는 않는 // 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이 // 들어 있는 포함 파일입니다.
#pragma once
#ifndef VC_EXTRALEAN #define VC_EXTRALEAN // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다. #endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다.
// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다. #define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 핵심 및 표준 구성 요소입니다. #include <afxext.h> // MFC 확장입니다.
#include <afxdisp.h> // MFC 자동화 클래스입니다.
CString GetExePath();
#ifndef _AFX_NO_OLE_SUPPORT #include <afxdtctl.h> // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다. #endif #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> // Windows 공용 컨트롤에 대한 MFC 지원입니다. #endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h> // MFC의 리본 및 컨트롤 막대 지원
|
[stdafx.cpp]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// stdafx.cpp : 표준 포함 파일만 들어 있는 소스 파일입니다. // test.pch는 미리 컴파일된 헤더가 됩니다. // stdafx.obj에는 미리 컴파일된 형식 정보가 포함됩니다.
#include "stdafx.h"
CCriticalSection g_criticalExe;
CString GetExePath() { g_criticalExe.Lock();
static TCHAR pBuf[ 256 ] = { 0, };
memset( pBuf, NULL, sizeof( pBuf ) );
GetModuleFileName( NULL, pBuf, sizeof( pBuf ) );
CString strFilePath = _T("");
strFilePath.Format( _T( "%s" ), pBuf );
strFilePath = strFilePath.Left( strFilePath.ReverseFind( _T( '\\' ) ) );
g_criticalExe.Unlock(); return strFilePath; } |
그리고 나서 testDlg.h와 testDlg.cpp안에 아래와 같이 코드를 작성하여 주시고 CreateUserDir() 함수의 선언 및 정의를 유심히 봐 주시기 바랍니다.
[testDlg.h]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// testDlg.h : 헤더 파일 //
#pragma once
// CtestDlg 대화 상자 class CtestDlg : public CDialogEx { // 생성입니다. public: CtestDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
// 대화 상자 데이터입니다. enum { IDD = IDD_TEST_DIALOG };
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
void CreateUserDir();
// 구현입니다. protected: HICON m_hIcon;
// 생성된 메시지 맵 함수 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() };
|
[testDlg.cpp]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
// testDlg.cpp : 구현 파일 //
#include "stdafx.h" #include "test.h" #include "testDlg.h" #include "afxdialogex.h"
#ifdef _DEBUG #define new DEBUG_NEW #endif
// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
class CAboutDlg : public CDialogEx { public: CAboutDlg();
// 대화 상자 데이터입니다. enum { IDD = IDD_ABOUTBOX };
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
// 구현입니다. protected: DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { }
void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); }
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP()
// CtestDlg 대화 상자
CtestDlg::CtestDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CtestDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
void CtestDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); }
BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() END_MESSAGE_MAP()
// CtestDlg 메시지 처리기
BOOL CtestDlg::OnInitDialog() { CDialogEx::OnInitDialog();
// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.
// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } }
// 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는 // 프레임워크가 이 작업을 자동으로 수행합니다. SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다. SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
// TODO: 여기에 추가 초기화 작업을 추가합니다.
CreateUserDir();
return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다. }
void CtestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } }
// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면 // 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는 // 프레임워크에서 이 작업을 자동으로 수행합니다.
void CtestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다. int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2;
// 아이콘을 그립니다. dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } }
// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서 // 이 함수를 호출합니다. HCURSOR CtestDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); }
void CtestDlg::CreateUserDir() { CString str = _T("");
str.Format("%s\\testLog", GetExePath()); //해당 경로 설정
CreateDirectory(str, NULL); //해당 경로에 폴더 생성
AfxMessageBox(_T("%s 경로에 TestLog 폴더 생성 완료",str)); } |
참고로 CreateDirectory()는 main 경로를 먼저 생성 한 후에 sub 경로를 생성하는 형식으로 폴더 경로를 만들어 나가야 합니다.
그렇지 않고 아직 생성되지 않은 전체 경로를 지정해 버리면 Directory 생성 실패가 됩니다.
Ex)
CreateDirectory(_T(“main”), NULL);
CreateDirectory(_T(“main/sub1”), NULL); (O)
CreateDirectory(_T(“C:\\a\\b\\c\\d\\e\\”), NULL); (X)
단계적으로 생성해 나가야 합니다.
[실행 결과]
이렇게 지정한 경로에 testLog 폴더가 생성된 것을 확인하실 수 있습니다.
이제는 이 안에 파일을 생성할 수도 있고, 아니면 다음 서브 경로를 더 지정하시면서 폴더를 계속 생성해 나가실 수 있습니다.
연습 겸 해보시면 될 것 같아요~~
감사합니다.^^
'C++ > MFC' 카테고리의 다른 글
[MFC] CList 사용 방법 (0) | 2018.07.23 |
---|---|
[MFC] C++ 파일 라인 수 읽는 방법 (0) | 2018.07.23 |
[MFC] 싱글톤 템플릿 선언 및 사용 방법 (0) | 2018.07.02 |
[MFC] 사용자 정의 메시지를 이용한 컨트롤 상태 변경 방법 (0) | 2018.07.02 |
[MFC] error c2065 에러 해결방법 (0) | 2018.06.28 |
이 글을 공유하기