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;
}
{
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;
}
덧글을 달아 주세요