MFC 폴더 생성 방법

[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 리본  컨트롤 막대 지원

 

Colored by Color Scripter

cs

 

[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, NULLsizeof( 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;

}

Colored by Color Scripter

cs

 

그리고 나서 testDlg.htestDlg.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()

};

 

Colored by Color Scripter

cs

 

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

}

Colored by Color Scripter

cs


참고로 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 폴더가 생성된 것을 확인하실 수 있습니다.

 

이제는 이 안에 파일을 생성할 수도 있고, 아니면 다음 서브 경로를 더 지정하시면서 폴더를 계속 생성해 나가실 수 있습니다


연습 겸 해보시면 될 것 같아요~~

 

감사합니다.^^


728x90

이 글을 공유하기

댓글

Designed by JB FACTORY