void CFileCopyDlg::OnFrom()
{
  m_ctrlListBox.ResetContent();
  char szFilter[] = _"All Files(*.*)*.*";
 
  CFileDialog dlg( TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, szFilter );
  if( IDOK == dlg.DoModal() )
  {
    for( POSITION pos = dlg.GetStartPosition(); pos!=NULL ; )
    {
      m_ctrlListBox.AddString( dlg.GetNextPathName( pos ) );
    }
  }
}

void CFileCopyDlg::OnTo()
{
  ITEMIDLIST  *pidlBrowse;
  char    pszPathname[MAX_PATH];
 
  BROWSEINFO BrInfo;
  BrInfo.hwndOwner = GetSafeHwnd();
  BrInfo.pidlRoot = NULL;
 
  memset( &BrInfo, 0, sizeof(BrInfo) );
  BrInfo.pszDisplayName  = pszPathname;
  BrInfo.lpszTitle    = "복사할 디렉터리를 선택하세요";
  BrInfo.ulFlags      = BIF_RETURNONLYFSDIRS;
 
  // 대화상자를 띄우기
  pidlBrowse = ::SHBrowseForFolder( &BrInfo );   
 
  if( pidlBrowse != NULL)
  {
    // 패스를 얻어옴
    SHGetPathFromIDList( pidlBrowse, pszPathname );   
    m_strDest = pszPathname;
    UpdateData( FALSE );
  }
}

void CFileCopyDlg::OnStartCopy()
{
  UpdateData();
 
  SHFILEOPSTRUCT *pFO = new SHFILEOPSTRUCT;
  pFO->hwnd = NULL;
  pFO->wFunc = FO_COPY;
  pFO->fFlags = FOF_NOCONFIRMMKDIR;
  pFO->fAnyOperationsAborted = TRUE;
  pFO->lpszProgressTitle = _T("파일 복사중");
 
  CMemFile file;
  CArchive ar( &file, CArchive::store );
 
  CString str;
  int nCount = m_ctrlListBox.GetCount();
  char null = '\0';
 
  for( int i = 0 ; i < nCount ; i++ )
  {
    m_ctrlListBox.GetText( i, str );
    ar.WriteString( str );
    ar.Write( &null, 1 );
  }
  ar.Write( &null, 1 );
  ar.Close();
 
  pFO->pFrom = (char *)file.Detach();
 
  // 복사될 디렉토리명 (Destination)
  pFO->pTo = new char[ m_strDest.GetLength() + 1 ];
  strcpy((LPSTR)pFO->pTo, (LPSTR)(LPCTSTR)m_strDest);
  ((LPSTR)pFO->pTo)[m_strDest.GetLength()] = 0;
 
  AfxBeginThread(ThreadFunc, pFO);
}


UINT ThreadFunc(LPVOID pParam)
{
  SHFILEOPSTRUCT *pFO = (SHFILEOPSTRUCT *)pParam;
 
  ::SHFileOperation(pFO);
 
  delete [] (char *)pFO->pFrom;
  delete [] (char *)pFO->pTo;
  delete pFO;
 
  return 0;
}
 
2006/05/14 00:20 2006/05/14 00:20

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요