카테고리

  • 안드로이드
  • IOS
  • MFC
  • JAVA
  • AWS
  • LAMP
  • 여행&사진
  • 이런저런생활
  • 2016년 1월 27일 수요일

    [MFC] zip파일로 압축 및 압축해제

    출처 - http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win
    참조 - http://blog.naver.com/binoz/40044276494

    기본 사용법은 위의 사이트에서 참조.
    여기서는 위의 오픈 소스를 이용해서
    하위 폴더 및 하위 파일까지 압축 하는 방법을 설명

    1. zip.h, zip.cpp, unzip.h, unzip.cpp 추가
    일반적인 헤더와 소스 추가 방식으로 추가해주면 됨.

    2.재귀 함수를 통한 하위 폴더 및 파일 압축
    소스는 MFC방식으로 입력합니다.
    다이얼로그에서 OK버튼 이벤트를 추가하고 OK버튼이 눌러지면
    다음 함수가 실행이 되게끔 처리합니다.

    //** OK버튼 이벤트
    void CZipTestDlg::OnBnClickedOK()
    {
      ZRESULT zr;
      HZIP hz;
      ZIPENTRY ze;
      //** 압축 결과물을 출력할 경로 및 파일 이름
      hz = CreateZip(_T("C:¥¥Test¥¥FileName.zip"), 0);
     
      //** 하위 폴더 및 파일 압축 함수
      //** 첫번째 파라미터 : 압축할 폴더 경로
      //** 두번째 파라미터 : 상위 폴더 경로 지정용(재귀 함수 호출 시 사용)
      //** 압축파일에 대한 포인터(주소값)
      GetFileList(_T("C:¥¥Copy¥¥Folder"), _T(""), &hz);

      zr = CloseZip(hz);

      //** 압축 해제
      hz = OpenZip(_T("C:¥¥Test¥¥FileName.zip"), 0);
      zr = SetUnzipBaseDir(hz, _T("C:¥¥Test"));
      zr = GetZipItem(hz, -1, &ze);
      int numitems = ze.index;

      for (int i=0; i<numitems; i++) {
        //** 압축 파일 인덱스 값 취득
        zr = GetZipItem(hz, i, &ze);
        if (zr != ZR_OK) {
          CString tmp;
          tmp.Format(_T("* Failed to get index %i of folders.zip"), i);
          MessageBox(tmp, MB_OK);
        }

        zr = UnzipItem(hz, i, ze.name);
        if (zr != ZR_OK) {
          CString tmp;
          tmp.Format(_T("* Failed to unzip item %i of folders.zip"), i);
          MessageBox(tmp, MB_OK);
        }
      }
      zr = CloseZip(hz);
    }

    //** 하위 폴더 및 파일 압축 함수(리커시브)
    void CZipTestDlg::GetFileList(Cstring path, Cstring folder, HZIP *hz)
    {
      CFileFind file;
      BOOL chi_bool = file.FindFile(path + _T("*.*"));

      CString m_path = path;
      CString m_FolderPath = folder;

      while(chi_bool) {
        ch_bool = file.FindNextFile();
        CString strName = _T("");
       
        if(file.IsArchived()) { //** 파일인 경우
          strName = file.GetFileName();
          CString tmpPathName = _T("");
          CString tmpFolderPath = _T("");

          if(strName.Compare(_T(".")) == 0 ||
            strName.Compare(_T("..")) == 0 ||
            strName.Compare(_T("Thumbs.db")) == 0) continue;

          tmpPathName = m_path + _T("¥¥") + strName;
          tmpFolderPath = m_FolderPath + _T("¥¥") + strName;

          zr = ZipAdd(*hz, tmpFolderPath, tmpPathName);
        } else if (file.IsDirectory()) {  //** 폴더인 경우
          strName = file.GetFileName();
          CString tmpPathName = _T("");
          CString tmpFolderPath = _T("");
         
          if(strName.Compare(_T(".")) == 0 ||
            strName.Compare(_T("..")) == 0 ||
            strName.Compare(_T("Thumbs.db")) == 0) continue;

          tmpPathName = m_path + _T("¥¥") + strName;
          if(m_FolderPath.IsEmpty())
            tmpFolderPath = strName;
          else
            tmpFolderPath = m_FolderPath + _T("¥¥") + strName;  //** 상위 폴더 경로 저장

          //** 압축파일 내에 폴더 경로 추가
          zr = ZipAddFolder(*hz, tmpFolderPath);

          //** 현재 함수 리커시브
          GetFileList(tmpPathName, tmpFolderPath, hz);
        }
      }
    }

    댓글 없음 :

    댓글 쓰기