728x90
300x250

[Ubuntu 14.10] 폰트 설치하기 (XRDP환경) - Ubuntu 14.04 서버

 

우분투 서버 내에서 font 설치하는 방법입니다.

 


1. 우분투(루분투)에서 글꼴 설치하기

 

한국 사용자가 가장 익숙해 하는 환경인 윈도우 7 환경을 기준으로 작성합니다.

그림 1-1) 폰트 넣기(우분투)

 

/usr/share/fonts/truetype 내에 ttf파일을 넣으시면 폰트가 설치됩니다.

 


2. 기타 추천하는 폰트

 

1. 나눔 고딕 개발자용 (네이버 Dev)

http://dev.naver.com/projects/nanumfont

 

가장 깔끔하고 단정한 폰트입니다. 무엇보다 가장 매력이 있는 점은 개인/기업/공공기관 등에서도 누구나 사용가능하다는 점입니다.

반응형
728x90
300x250

[Ubuntu 14.10] XRDP - 우분투 14.10 서버(Gnome Classic)

 
우분투 14.10 서버에서 XRDP를 사용하는 방법에 대해서 소개하고자 합니다.


1. 설치하기


1. Install XRDP Package from Ubuntu Repository

sudo apt-get install xrdp

 

xrdp를 설치합니다. (터미널)

 

2. 방화벽 포트 개방

sudo ufw allow 20

sudo ufw allow 21 

sudo ufw allow 22 

sudo ufw allow 3389 (RDP 프로토콜)

 

3. Installing the SSH(OpenSSH)

sudo apt-get install SSH

 

4. Installing the xfce4

sudo apt-get install xfce4

 

5. Installing the Gnome-Terminal

sudo apt-get install gnome-terminal

 

6. 나눔체, 나눔코딩체, Nabi 프로그램 설치(언어전환) (옵션)

sudo apt-get install ttf-nanum ttf-nanum-coding nabi

 

7. Installing the MATE Desktop environment

sudo apt-get update
sudo apt-get install mate-core mate-desktop-environment mate-notification-daemon

 

8. .xsession 파일 만들기

sudo echo mate-session> ~/.xsession

 

9. Hostname 확인하기

hostname -I

 

10. xrdp 서비스 재시작

sudo service xrdp restart

 


2. 클라이언트에서 사용하기


원격 데스크톱 연결을 실행합니다.


 

Fig 2-1) 원격 데스크톱 연결

 

우분투 서버 계정 정보를 입력하고 OK를 클릭합니다.

 

 

Fig 2-2) 원격 데스크톱 연결

 

Fig 2-2처럼 설정된 우분투의 계정을 입력 후 로그인을 하면, Fig 2-3처럼 로그인된 화면을 볼 수 있다.

 

 

Fig 2-3) 원격 데스크톱 연결

반응형
728x90
300x250

[Ubuntu 14.02] 한글 자판 편하게 사용하기

 

우분투 14.02에서 한글 자판을 편하게 사용하는 방법에 대해서 소개합니다.

 

- 운영체제 : Ubuntu 14.02


1. System Settings

 

Language Support를 클릭합니다.

 

2. System Settings->Language Support

 

 

Install / Remove Languages를 클릭합니다.

 

 

Korean에 체크하고 Apply Changes를 클릭합니다.

그러면 설치 과정이 진행되는 걸 볼 수 있습니다.

 

 

Keyboard Input method system을 ibus로 선택합니다.

close를 누릅니다.

 

 

Text Entry를 클릭합니다.

 

3. System Settings->Text Entry

 

 

제가 캡쳐한 화면에는 English(US)와 Korean(Hangul)이 두 개가 있는데, 처음 진행하시는 분들 화면에는 English(US)만 있습니다.

아래의 + 버튼을 클릭합니다.

 


Korean을 클릭 후 Add를 클릭합니다.

 

4. Terminal -> dconf-tools 설치
터미널 창을 열어 dconf-tools를 설치합니다.

 

 

설치 후에 dconf Editor를 킵니다.

트리 메뉴에서 org.gnome->desktop->wm->keybindings을 클릭합니다.

switch-Input-source의 Value를 더블클릭하여 ['<Shift>space']이라고 입력합니다.

switch-Input-source-backward의 Value를 더블클릭하여 ['Hangul']이라고 입력합니다.



참고) Text Entry의 Switch 소스

 

 

switch to next source using 항목이 dconf의 switch-input-source이며,

switch to previous source using 항목이 dconf의 switch-input-source-backward 입니다.

 

Text Entry로는 단순 키 조합 밖에 이용할 수 없어서, 예를 들면 한글(전환)키를 설정하려고 하면, Alt+Hangul 이런식의

조합 밖에 되지 않습니다.

 

dconf Editor를 통해 수동 조작하여 명령을 수행할 수 있도록 한 것입니다.


5. 재부팅 후 사용하기


재부팅한 후 사용하면 됩니다.

반응형
728x90
300x250

[Java] Deep Copy & Shallow Copy

 

1. 개념(Concept)


 

2. 소스 코드

 

class Account implements Cloneable{

        private String accnum;
        private int balance;

 

        public void setNum(String accnum)
        {
             this.accnum = accnum;  
        }

        public String getNum()
       {
            return this.accnum;
       }
 

         
       protected Object clone()
       {

 

               try{
                    Account account = (Account)super.clone();
                    return account;
               }
              catch(CloneNotSupportedException e)
              {
                   e.printStackTrace();
              }
              return null;
       } 

}

 

Source) Account.java

 

public class Program
{

      public static void deepcopy()
     {
              Account source = new Account();
              source.setNum("111");

 
             Account target = (Account)source.clone(); // clone()은 Overliding으로 구현.
  
              System.out.println( "소스원본:" + source.getNum() );
              System.out.println( "대상-깊은 복사:" + target.getNum() );

 

              System.out.println( "원본값 계좌번호 변경 333\n" );


              source.setNum("333");


              System.out.println( "소스원본:" + source.getNum() );
              System.out.println( "대상-깊은 복사:" + target.getNum() + "\n" );
       }


       public static void shallowcopy()
       {
              Account source = new Account();
           source.setNum("111");

 

              Account target = source;
  
              System.out.println( "소스원본:" + source.getNum() );
              System.out.println( "대상-얇은 복사:" + target.getNum() );

 

              System.out.println( "원본값 계좌번호 변경 333\n" );
              source.setNum("333");


              System.out.println( "소스원본:" + source.getNum() );
              System.out.println( "대상-얇은 복사:" + target.getNum() + "\n" );
       }

 

       public static void main(String args[])
       { 
              System.out.println("--- 1.깊은 복사------------------");
           deepcopy();

 

              System.out.println("--- 2.얇은 복사------------------");
            shallowcopy();
       }

}

 

 

 

Main Source) Program.java

 

3. 동작 결과

 

 


이해가 되었으면 합니다.^^

 

[첨부(Attachment)]

Sample-copy.zip

 

반응형
728x90
300x250

[Java] IceCream - Class 구현

 

아이스크림 클래스를 작성하였습니다.
이해를 돕기 위해서 작성하였습니다.

 


interface IceCream{
     abstract void use();
     abstract void destroy();
}

class Bar implements IceCream{
 
      public void use(){
           System.out.println("맛있는 막대바 아이스크림 섭취");
      }
 
      public void destroy()
      { 
           System.out.println("다 먹음(막대바)"); 
      }
}

 

class Cone implements IceCream{
 
      public void use()
      {
           System.out.println("맛있는 콘 타입 아이스크림 섭취");
      }
 
      public void destroy(){
           System.out.println("다 먹음(콘 타입)");
      }
}

public class Output {
 
     public static void main(String args[])
     {
           Bar iceCreamBar = new Bar();
           Cone iceCreamCone = new Cone();
  
           iceCreamBar.use();
           iceCreamCone.use();
  
           iceCreamBar.destroy();
           iceCreamCone.destroy();
     }

 아이스크림을 추상화함. - Output.java

 

(아이스크림 바, 아이스크림 콘)을 먹을 때 공통적으로 할 수 있는 일

두 가지로 생각해봄.

-> 먹는다(use)

-> 버린다(destroy)

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 트리 컨트롤

 

이번에는 트리 컨트롤에 대해서 소개하고자 합니다.

 

위의 그림에서 빨간색으로 표기된 구조가 Tree Control의 한 예입니다.

이런 구조는 많이 익숙하실거라고 생각됩니다.

 


1. CTreeCtrl 클래스

 

1-a. 멤버 함수

 * InsertItem

 HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT , HTREEITEM hInsertAfter = TVI_LAST ) ;

 

 -> lpszItem : 아이템에 표시할 문자열 주소

 -> hParent : 추가되어 있는 부모 아이템의 헨들 -> TVI_ROOT는 루트 아이템으로 기본 값 지정되어 있음.

 

     (궁금하신 분들은 자료 정의나 구글링 해보세요.)

 -> hInsertAfter : 새로운 아이템이 어떤 아이템의 뒤에 삽입될 것인지를 지정

 *> Return Value : 추가된 아이템의 헨들(HTREEITEM 반환), 실패시 NULL

 

 기존에 리스트 컨트롤 강의에선 InsertItem 이런 거에 담는 개념이었는데,

 이 원형은 HTREEITEM이라는 형태로 반환하여 뿌리 구축 단위로 동작함. (직접 코드 짜보면 이해함)

 

 * DeleteItem 

 BOOL DeleteItem ( HTREEITEM hItem ) ;

 -> hItem : 삭제할 트리 아이템의 헨들

 -> Return Value : 성공시 TRUE, 실패시 FALSE;

 * DeleteAllItems

 BOOL DeleteAllItems( ) ;

 

 -> 트리 컨트롤의 모든 아이템들을 전체 삭제함.

 

 -> Return Value : 성공시 TRUE, 실패시 FALSE

 * GetParentItem

 HTREEITEM GetParentItem( HTREEITEM hItem ) const;

 

 -> hItem : 부모 아이템을 찾고자 하는 트리 아이템의 핸들 (쉽게 말하면 부모 아이템을 가져온다고 이해하는 게 정신적으로 편함)

 -> Return Value : 부모 아이템의 핸들, 실패시 NULL

 

 * GetItemText

 CString GetItemText ( HTREEITEM hItem ) const ;

 

 -> hItem : 텍스트를 획득하고자 하는 트리 아이템의 핸들

 -> Return Value : 트리 아이템의 텍스트

 


1-b. 트리 컨트롤(Tree Control)의 Primative Attribute (주요 속성)

 

 

 

주요 속성이라고 지정하긴 제목을 말하긴 했는데, 트리를 운영하는 데 가장 중요한 요소라서 이렇게 불렀으니깐

쉽게 생각하시기 바랍니다. 잊어버리셔도 됩니다. 동물적으로 찾아서 보실 수 있으면 됩니다.

 

 트리 컨트롤 속성

 설명

 Check Boxes

 아이템에 체크박스를 표시하기 위한 속성

 Has Buttons

 서브 아이템이 있는 경우,

 해당 아이템에 [+], [-] 버튼을 표시하기 위한 속성

 (옵션??이 더 맞는 말인거 같음)

 Has Lines

 아이템 간의 연결 관계를 라인을 사용하여 표현하기 위한 속성

 -> 제 블로그에도 사실 보면 트리 라인있습니다.

     모르시면 메뉴 보셔도 됩니다.

 Lines At Root

 루트 아이템에도 라인을 표시하기 위한 속성.

 Single Expand

 확장되는 아이템을 하나로 지정하기 위한 속성.

 True로 설정하면 하나의 아이템을 확장했을 때 다른 확장 아이템은 축소한다.

 Tract Select

 트래킹 표시를 지정하기 위한 속성

 True로 설정하면 마우스 포인터가 위치된 아이템에 밑줄이 표시된다.

 

 


2. 결과물

 

 

 

 

 

 

 

 

 


3. 실습

 

a. 레이아웃 디자인

 

컨트롤 이름 

 범주(T)

 매개 변수(N)

 비고

 IDC_TREE1

 Control

 m_yourtree

 

 IDC_EDIT1

 해당 없음

 해당 없음

 해당 없음

 

IDC_TREE1의 리소스 속성

Has Buttons, Has Lines, Single Expand, Lines At Root (True)로 해주기

 

 

 

 


4. 코드 구현

 

// CMyTreeDlg 메시지 처리기

BOOL CMyTreeDlg::OnInitDialog()

 

//         (중략~~~~~)

 

         // TODO: 여기에 추가 초기화 작업을 추가합니다.

         HTREEITEM root_branch = m_yourtree.InsertItem(_T("지사"));
         HTREEITEM root_headoffice = m_yourtree.InsertItem(_T("본사"));

         HTREEITEM child_b_china = m_yourtree.InsertItem(_T("중국"), root_branch);
         HTREEITEM child_b_gumi = m_yourtree.InsertItem(_T("한국"), root_branch);

         HTREEITEM child_h_seoul = m_yourtree.InsertItem(_T("서울"), root_headoffice);
         HTREEITEM child_b_c_bejing = m_yourtree.InsertItem(_T("베이징"), child_b_china);

         // this->m_yourtree.InsertItem

 

//         (중략~~~~~)

 

}

 OnInitDialog

 

 

void CMyTreeDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);  // 자동 생성된 부분임.

 

          // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
          HTREEITEM hItemRoot;
          HTREEITEM hItemParent;
          HTREEITEM hItemCur;

 

          CString strRoot;
          CString strParent;
          CString strCur;

          CString strTxt;

 

          hItemCur = pNMTreeView->itemNew.hItem;
          hItemParent = this->m_yourtree.GetParentItem( hItemCur );
          hItemRoot = this->m_yourtree.GetParentItem( hItemParent );

 

          strRoot = m_yourtree.GetItemText(hItemRoot);
          strParent = m_yourtree.GetItemText(hItemParent);
          strCur = m_yourtree.GetItemText(hItemCur);
 
          strTxt.Append(_T("/") + strRoot);
          strTxt.Append(_T("/") + strParent);
          strTxt.Append(_T("/") + strCur);
 
          ::SetDlgItemText( this->m_hWnd, IDC_EDIT1, strTxt );

 

 

           *pResult = 0;      // 자동 생성된 부분임.

 

 OnTvnSelchangedTree1 ( ) -> 마우스로 클릭해서 생성한 함수 원형
 -> (쉽게 말하면, 트리 선택시 동작 구현)

 

 

 

 

 

 

[첨부(Attachment)]

MyTree.zip

 

 

반응형
728x90
300x250
[MFC] 윈도우 프로그래밍 기초 - List Control

 

이번 글은 직접 List Control을 구현해보는 것이 기본 목표입니다.

 

개념은 기본 멤버함수 몇 개 소개하는 것으로 시작하겠습니다.

 

1. CListCtrl 클래스의 멤버함수

 

 * InsertColumn

 

 int InsertColumn ( int nCol,

                           LPCTSTR lpszColumnHeading,

                           int nFormat = LVCFMT_LEFT,

                           int nWidth = -1,

                           int nSubItem = -1 );

 

-> nCol : 컬럼 헤더의 인덱스 값

-> lpszColumnHeading : 컬럼 헤더에 표시할 문자열

-> nFormat : 컬럼 헤더에 표시할 문자열의 정렬방식을 지정하며, 다음의 값들을 지정하여 사용가능.

-> Return 값 : 컬럼 추가에 성공하면 컬럼의 인덱스를 반환하며, 실패하면 -1을 반환한다.

 

 포멧 값

 정렬 방식

 LVCFMT_RIGHT

 오른쪽 정렬

 LVCFMT_LEFT

 왼쪽 정렬

 LVCFMT_CENTER

 중앙 정렬

 

-> nWidth : 컬럼 헤더의 너비

-> nSubItem : 연관된 하위 항목의 인덱스

-> Return 값 : 컬럼 추가에 성공하면 컬럼의 인덱스를 반환하며, 실패하면 -1을 반환한다.

 

 * DeleteColumn

 BOOL DeleteColumn ( int nCol ) ;

 

 -> nCol : 삭제하고자 하는 컬럼의 인덱스

 -> Return 값 : 삭제에 실패하면 0 (FALSE)을, 성공하면 1 (TRUE)을 반환한다.

 * InsertItem

 int InsertItem ( const LVITEM* pItem ) ;

 

-> pItem : 리스트 컨트롤에 등록할 LVITEM 구조체 포인터

-> Return 값 : 성공 시 추가된 아이템의 인덱스, 실패 시 -1

 * SetItemText

 BOOL SetItemText ( int nItem, int nSubItem, LPCTSTR lpszText ) ;

 

-> nItem : 아이템 인덱스

-> nSubItem : 서브 아이템 인덱스

-> lpszText : 출력할 텍스트 변수의 포인터

-> Return 값 : 실패시 0(FALSE), 성공시 1(TRUE) 반환 

 * GetItemText

 CString GetItemText ( int nItem, int nSubItem ) const

 

-> nItem : 아이템 인덱스

-> nSubItem : 서브 아이템 인덱스

-> Return 값 : 지정한 아이템 또는 서브 아이템의 문자열

 * DeleteItem

 BOOL DeleteItem ( int nItem );

 

-> nItem : 아이템 인덱스

-> Return 값 : 성공시 TRUE(1), 실패시 FALSE

 * DeleteAllItems

 BOOL DeleteAllItems( );

 

-> Return 값 : 성공시 TRUE, 실패시 FALSE

 

2. 결과물

 

 

 

 

3. 레이아웃

 

List Control에 변수를 만들어 줍니다.

 

 컨트롤 이름

 범주(T)

 변수 이름(N)

 비고

 List Control

 Control

 m_ListView

 

 

 

 

ListControl 속성의 View를 Report로 바꿔줍니다.

 

 

4. 코드

 

 

 BOOL CListControlDlg::OnInitDialog(){

 

           (중략)

            // TODO: 여기에 추가 초기화 작업을 추가합니다.

           m_ListView.InsertColumn(0, _T("번호"), NULL, 50);
           m_ListView.InsertColumn(1, _T("이름"), NULL, 150);
           m_ListView.InsertColumn(2, _T("비고"), NULL, 50);

 

           // LVITEM - 삽입 데이터 보관 장소
           LVITEM firstitem = { 0 } ;  LVITEM seconditem = { 0 } ;


           firstitem.mask = LVIF_TEXT;
           firstitem.iItem = 0;

 

           seconditem.mask = LVIF_TEXT;
           seconditem.iItem = 0;

 

           // 데이터 삽입 - Firstitem
           m_ListView.InsertItem(&firstitem);

 

           // 데이터 값 넣기 - Firstitem
           m_ListView.SetItemText(0, 0, _T("1번"));
           m_ListView.SetItemText(0, 1, _T("도도1-1"));
           m_ListView.SetItemText(0, 2, _T("도도1-2"));

 

            // 데이터 삽입 - Seconditem
           m_ListView.InsertItem(&seconditem);
 
           // 데이터 값 넣기 - Seconditem
          m_ListView.SetItemText(0, 0, _T("2번"));
          m_ListView.SetItemText(0, 1, _T("도도2-1"));
          m_ListView.SetItemText(0, 2, _T("도도2-2"));

        

          UpdateData(FALSE);

 

          return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}

 dlg.cpp 파일 내 코드

 

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 프로그래스 컨트롤

 

프로그래스 컨트롤은 아래와 같이 진행되고 있는 데이터의 상태를 보여주기 위해 사용하는 컨트롤입니다.

 

 

(윈도우 탐색기의 프로그래스 컨트롤)

 

프로그래스 컨트롤이 어떠한 원리로 사용되는지 소개하겠습니다.

 


1. 배경지식


1. CProgressCtrl 클래스


a) CProgressCtrl의
멤버 함수

 

 

 * GetPos( ) 

  int GetPos( ) ;

 

  -> Return 값 : 현재 Position 값

 

 

 * GetRange( )

 void GetRange( int & nLower, int & nUpper)

 

  ->

  nLower : 영역의 최저 값을 받을 int 형 변수

  nUpper : 영역의 최대 값을 받을 int 형 변수

 

 

 * SetBkColor

 COLORREF SetBkColor( COLORREF clrNew ) ; 

 

 ->

   clrNew : 프로그래스 컨트롤의 배경색으로 지정할 색상 값

   Return 값 : 변경하기 전의 배경색 색상 값 

 

 

 * SetPos

  int SetPos( int nPos );

 

 ->

   nPos : 프로그래스 바의 포지션을 변경할 값

   Return 값 : 변경하기 전의 프로그래스 바의 포지션 값

 

 

 * SetRange

  void SetRange( short nLower, short nUpper ) ;

 

  void SetRange32 ( int nLower, int nUpper ) ;

 

 ->

   nLower : 프로그래스 바의 최저 값 (색이 채워지지 않는 값)

   nUpper : 프로그래스 바의 최대 값 (색을 모두 채우는 값)

 

  최저값 : 0

  최대값 : 100까지

 

 


2. 결과물

 

오늘의 실습 주제 : 파일 복사 프로그래스로 측정해보기

 

 

 

 결과물

 

 

 버튼 - 원본파일) 찾아보기

 

버튼 - 복사 경로) 찾아보기

 

 

 버튼 - 파일 복사) 클릭시 결과

 

 

 곰돌이.mp3 복사된 것을 확인 할 수 있음.

 


3. 레이아웃 디자인

 

변수 설정할 부분만 설명해놨습니다.

버튼은 여러분이 이벤트 처리기로 하시면 됩니다. (이 부분은 여러분의 감각 믿습니다.)

 

 컨트롤

 캡션

 범주(T)

 변수 이름(N)

 택스트 컨트롤

 X

 Value

 m_original

 택스트 컨트롤 

 X

 Value 

 m_copydir

 프로그래스

 X

 Control

 m_progress

 


4. 소스코드

 

 // CProgressDlg.h : 헤더 파일
 //

 #pragma once
 #include "afxcmn.h"

 

 #define PROGRESSVALUE(a, b) (int)((double)( a * 100 ) / (double) b )

 

 // 이 부분은 메크로 함수로 PROGRESS 값을 반환하도록 했는데, 여러분이 함수형으로 구현하셔도 되고 상관없습니다.

 CProgressDlg.h

 

 

 
// 원본 파일
 void CCProgressDlg::OnBnClickedButton1()
 {
      TCHAR szFilter[] = _T("All Files (*.*)|*.*|");

      CFileDialog dlg(TRUE, _T("*"), _T("*.*"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);

 

      if (dlg.DoModal() == IDOK)
     {
            m_original = dlg.GetPathName();

            // 데이터 갱신
            UpdateData(FALSE);

     }
}

 원본 파일 찾기 - 구현 

 
// 복사 경로
void CCProgressDlg::OnBnClickedButton2()
{
       TCHAR szFilter[] = _T("All Files (*.*)|*.*|");

       CFileDialog dlg(FALSE, _T("*"), _T("*.*"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);

 

       if (dlg.DoModal() == IDOK)
       {
             m_copydir = dlg.GetPathName();

             // 데이터 갱신
             UpdateData(FALSE);

       }

 복사 경로 찾기 - 구현

 // 파일 복사 DWORD CALLBACK buksa( )

DWORD CALLBACK buksa(LARGE_INTEGER TotalFileSize,
 LARGE_INTEGER TotalBytesTransferred,
 LARGE_INTEGER StreamSize,
 LARGE_INTEGER StreamBytesTransferred,
 DWORD dwStreamNumber,
 DWORD dwCallbackReason,
 HANDLE hSourceFile,
 HANDLE hDestinationFile,
 LPVOID lpData)
{
         CCProgressDlg* pDlg = (CCProgressDlg*)lpData;

        

         int pos = PROGRESSVALUE( TotalBytesTransferred.QuadPart,
                      TotalBytesTransferred.QuadPart );

 

         // Pos 설정
         pDlg->m_progress.SetPos(pos);

 

         // 100 퍼센트 전송되지 않을 때
         if (pos < 100)
               return PROGRESS_CONTINUE;

        

         // 100 퍼센트 전송되었을 때
         MessageBox(NULL, _T("복사가 완료되었습니다. "), _T("확인"), MB_ICONINFORMATION + MB_OK);

 

         return PROGRESS_QUIET;

 이 부분 원형은 외우지 말 것 (파일 복사 Routine 때문에 구현)

 

   // 대상 파일 복사
  void CCProgressDlg::OnBnClickedButton3()
  {
         // 프로그래스 초기 설정
         m_progress.SetRange(0, 100);
         m_progress.SetPos(0);

       

         // 복사 진행
         CopyFileEx(m_original, m_copydir, buksa, this, NULL, COPY_FILE_FAIL_IF_EXISTS);
}

 대상 파일 복사

 

소스코드 : CProgress.zip

 

이번 글은 약간 어려울 수 있는데, 별거 없습니다.

특히나 DWORD CALLBACK buksa( ) 의 경우 WinBase.h 정의로 이동해서 그대로 가져다가 사용하면 저 원형 그대로 사용할 수 있습니다.

이번 글에서 의도한 것은 기본적인 부분은 프로그래스를 사용하실 수 있게 해드리는 것이고, 두 번째로 코드는 힘들게 외우지 말라는 것을

알려드리고 싶어서 아래의 자료와 함께 올려드렸습니다.

 

아래의 자료는 MSDN의 CopyFileEx와 CopyRoutine 원형의 설명이 담긴 자료입니다.

저 설명은 다 외우지 말고 여러분이 원하는 방법으로 변경할 때 참고하시면 됩니다.

 


5. 참고사항1) CopyFileEx

 


BOOL
WINAPI
CopyFileEx(
    _In_        LPCWSTR lpExistingFileName,
    _In_        LPCWSTR lpNewFileName,
    _In_opt_    LPPROGRESS_ROUTINE lpProgressRoutine,
    _In_opt_    LPVOID lpData,
    _When_(pbCancel != NULL, _Pre_satisfies_(*pbCancel == FALSE))
    _Inout_opt_ LPBOOL pbCancel,
    _In_        DWORD dwCopyFlags
);

 

 CopyFileEx 함수 원형

 

 

 파라메터

 설명

 lpExistingFileName

 원본 파일 지정

 lpNewFileName

 새로 복사할 위치 지정

 lpProgressRoutine

 파일 복사 콜백 함수(Routine 함수 지정)

 lpData

 부모 함수를 포인터로 전달할 것인지에 대한 판단

 (ex : this (자기 자신을 함수 포인터로 전달)

 dwCopyFlags

 복사 플래그 지정

 

* dwCopyFlags

 

dwCopyFlags [in]

Flags that specify how the file is to be copied. This parameter can be a combination of the following values.

 

Value Meaning
COPY_FILE_ALLOW_DECRYPTED_DESTINATION
0x00000008

An attempt to copy an encrypted file will succeed even if the destination copy cannot be encrypted.

COPY_FILE_COPY_SYMLINK
0x00000800

If the source file is a symbolic link, the destination file is also a symbolic link pointing to the same file that the source symbolic link is pointing to.

Windows Server 2003 and Windows XP:  This value is not supported.

COPY_FILE_FAIL_IF_EXISTS
0x00000001

The copy operation fails immediately if the target file already exists.

COPY_FILE_NO_BUFFERING
0x00001000

The copy operation is performed using unbuffered I/O, bypassing system I/O cache resources. Recommended for very large file transfers.

Windows Server 2003 and Windows XP:  This value is not supported.

COPY_FILE_OPEN_SOURCE_FOR_WRITE
0x00000004

The file is copied and the original file is opened for write access.

COPY_FILE_RESTARTABLE
0x00000002

Progress of the copy is tracked in the target file in case the copy fails. The failed copy can be restarted at a later time by specifying the same values for lpExistingFileName and lpNewFileName as those used in the call that failed. This can significantly slow down the copy operation as the new file may be flushed multiple times during the copy operation.

 

 


6. 참고사항2) CopyProgressRoutine

CopyProgressRoutine callback function

An application-defined callback function used with the CopyFileEx, MoveFileTransacted, and MoveFileWithProgress functions. It is called when a portion of a copy or move operation is completed. The LPPROGRESS_ROUTINE type defines a pointer to this callback function. CopyProgressRoutine is a placeholder for the application-defined function name.

Syntax

C++
DWORD CALLBACK CopyProgressRoutine(
  _In_      LARGE_INTEGER TotalFileSize,
  _In_      LARGE_INTEGER TotalBytesTransferred,
  _In_      LARGE_INTEGER StreamSize,
  _In_      LARGE_INTEGER StreamBytesTransferred,
  _In_      DWORD dwStreamNumber,
  _In_      DWORD dwCallbackReason,
  _In_      HANDLE hSourceFile,
  _In_      HANDLE hDestinationFile,
  _In_opt_  LPVOID lpData
);

typedef DWORD (WINAPI *LPPROGRESS_ROUTINE)(
    _In_      LARGE_INTEGER TotalFileSize,
    _In_      LARGE_INTEGER TotalBytesTransferred,
    _In_      LARGE_INTEGER StreamSize,
    _In_      LARGE_INTEGER StreamBytesTransferred,
    _In_      DWORD dwStreamNumber,
    _In_      DWORD dwCallbackReason,
    _In_      HANDLE hSourceFile,
    _In_      HANDLE hDestinationFile,
    _In_opt_  LPVOID lpData
);

Parameters

TotalFileSize [in]

The total size of the file, in bytes.

TotalBytesTransferred [in]

The total number of bytes transferred from the source file to the destination file since the copy operation began.

StreamSize [in]

The total size of the current file stream, in bytes.

StreamBytesTransferred [in]

The total number of bytes in the current stream that have been transferred from the source file to the destination file since the copy operation began.

dwStreamNumber [in]

A handle to the current stream. The first time CopyProgressRoutine is called, the stream number is 1.

dwCallbackReason [in]

The reason that CopyProgressRoutine was called. This parameter can be one of the following values.

 

Value Meaning
CALLBACK_CHUNK_FINISHED
0x00000000

Another part of the data file was copied.

CALLBACK_STREAM_SWITCH
0x00000001

Another stream was created and is about to be copied. This is the callback reason given when the callback routine is first invoked.

 

hSourceFile [in]

A handle to the source file.

hDestinationFile [in]

A handle to the destination file

lpData [in, optional]

Argument passed to CopyProgressRoutine by CopyFileEx, MoveFileTransacted, or MoveFileWithProgress.

Return value

The CopyProgressRoutine function should return one of the following values.

Return code/value Description
PROGRESS_CANCEL
1

Cancel the copy operation and delete the destination file.

PROGRESS_CONTINUE
0

Continue the copy operation.

PROGRESS_QUIET
3

Continue the copy operation, but stop invoking CopyProgressRoutine to report progress.

PROGRESS_STOP
2

Stop the copy operation. It can be restarted at a later time.

 

Remarks
An application can use this information to display a progress bar that shows the total number of bytes copied as a percent of the total file size.

Requirements

Minimum supported client

Windows XP [desktop apps only]

Minimum supported server

Windows Server 2003 [desktop apps only]

Header

WinBase.h (include Windows.h)

 


7. 참고자료(Reference) 

 

1. https://msdn.microsoft.com/en-us/library/windows/desktop/aa363852(v=vs.85).aspx, 접속일자 2015-03-31

2. https://msdn.microsoft.com/en-us/library/windows/desktop/aa363854(v=vs.85).aspx, 접속일자 2015-03-31

반응형

+ Recent posts