www.pudn.com > 多线程文件分割软件.rar > SplitFileDlg.cpp
// SplitFileDlg.cpp : implementation file // #include "stdafx.h" #include "SplitFile.h" #include "SplitFileDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About CListm_Split_Merge_FileList; class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; CColorButton m_btnOk; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) DDX_Control(pDX, IDOK, m_btnOk); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSplitFileDlg dialog CSplitFileDlg::CSplitFileDlg(CWnd* pParent /*=NULL*/) : CDialog(CSplitFileDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSplitFileDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CSplitFileDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSplitFileDlg) DDX_Control(pDX, IDC_BUTTON1, m_stop); DDX_Control(pDX, IDC_PROGRESS1, m_pg); DDX_Control(pDX, IDC_BTN_SPLITFILEDIR, m_btnBrowseSplitFileDir); DDX_Control(pDX, IDC_BTN_SPLITFILE, m_btnSplitFile); DDX_Control(pDX, IDC_BTN_MERGEFILE, m_btnMergeFile); DDX_Control(pDX, IDC_BTN_BROWSESPLITFILE, m_btnBrowseSplitFile); DDX_Control(pDX, IDC_BTN_BROWSEMERGEFILE, m_btnBrowseMergeFile); DDX_Control(pDX, IDC_EDIT_SPLITTOCOPIES, m_edtSplitCopies); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSplitFileDlg, CDialog) //{{AFX_MSG_MAP(CSplitFileDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BTN_SPLITFILE, OnBtnSplitfile) ON_BN_CLICKED(IDC_BTN_MERGEFILE, OnBtnMergefile) ON_BN_CLICKED(IDC_BTN_BROWSESPLITFILE, OnBtnBrowsesplitfile) ON_BN_CLICKED(IDC_BTN_BROWSEMERGEFILE, OnBtnBrowsemergefile) ON_EN_CHANGE(IDC_EDIT_SRCFILE, OnChangeEditSrcfile) ON_EN_CHANGE(IDC_EDIT_SPLITTOCOPIES, OnChangeEditSplittocopies) ON_BN_CLICKED(IDC_BTN_SPLITFILEDIR, OnBtnSplitfiledir) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSplitFileDlg message handlers BOOL CSplitFileDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_stop.EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control } void CSplitFileDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CSplitFileDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle 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; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CSplitFileDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } BOOL SaveSplitFileInfo(CString szFileName) { if(m_Split_Merge_FileList.GetCount() < 1) { return FALSE; } CFile file; if(file.Open(szFileName, CFile::modeCreate | CFile::modeWrite)) { CArchive arStore(&file, CArchive::store); m_Split_Merge_FileList.Serialize(arStore); arStore.Close(); file.Close(); return TRUE; } return FALSE; } void SplitFile(LPVOID param) { CString szFileName; int nCopies; CString szDir; CSplitFileDlg* dpthis; dpthis=(CSplitFileDlg*)param; DBpa dp=dpthis->pa; szFileName.Format("%s",dp.filename); szDir.Format("%s",dp.path); nCopies=dp.cd; dpthis->m_btnSplitFile.EnableWindow(FALSE); dpthis->m_stop.EnableWindow(TRUE); //((CButton*)GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_BUTTON1))->EnableWindow(TRUE); //((CButton*)::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_BUTTON1))->EnableWindow(TRUE); //((CProgressCtrl*)GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PROGRESS1))->SetRange(0,nCopies); //((CProgressCtrl*)GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_PROGRESS1))->SetPos(0); if(szFileName.IsEmpty() || (nCopies < 2)) { } int i,nPos; int nSplitFileCount = 0; DWORD dwFileLen; DWORD dwReadSize,dwLeftSize; CString szSplitFileName(""),szSplitFile(""); CString szFile(""); char *pszBuff = NULL; SPLIT_MERGE_FILE splitfile; CFile fileRead,fileWrite; if(!fileRead.Open(szFileName, CFile::modeRead | CFile::shareExclusive)) { } dwFileLen = fileRead.GetLength(); dwReadSize = dwFileLen / nCopies; dwLeftSize = dwFileLen - dwReadSize * (nCopies - 1); nPos = szFileName.ReverseFind('\\'); if(nPos != -1) { szFile = szFileName.Right(szFileName.GetLength() - nPos - 1); } fileRead.SeekToBegin(); //写 nCopies-1 个分解文件 for(i=1; i m_hWnd,IDC_PROGRESS1))->Set(i); //(CStatic*)SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_STAT,"33"); delete []pszBuff; pszBuff = NULL; } dpthis->m_pg.SetPos(i); } //写第 nCopies 个分解文件 pszBuff = new char[dwLeftSize]; if(NULL != pszBuff) { fileRead.ReadHuge(pszBuff, dwLeftSize); szSplitFileName.Format(_T("%s.X%d"), szFileName, nCopies); nPos = szSplitFileName.ReverseFind('\\'); if(nPos != -1) { szSplitFile = szSplitFileName.Right(szSplitFileName.GetLength() - nPos - 1); szSplitFileName.Format(_T("%s%s"), szDir, szSplitFile); } if(fileWrite.Open(szSplitFileName, CFile::modeCreate | CFile::typeBinary | CFile::modeWrite | CFile::shareExclusive)) { sprintf(splitfile.szFileName, "%s", szSplitFile); m_Split_Merge_FileList.AddTail(splitfile); fileWrite.WriteHuge(pszBuff, dwLeftSize); fileWrite.Close(); } delete []pszBuff; pszBuff = NULL; } szSplitFileName.Format(_T("%s%s.XX"), szDir, szFile); SaveSplitFileInfo(szSplitFileName); fileRead.Close(); //((CButton*)GetDlgItem(IDC_BUTTON1))->EnableWindow(FALSE); //((CButton*)::GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_BUTTON1))->EnableWindow(TRUE); } void CSplitFileDlg::OnBtnSplitfile() { // TODO: Add your control notification handler code here int nCopies; CString szText(""),szFileName(""),szFile("");; CString szPath(""); ((CEdit *)GetDlgItem(IDC_EDIT_SPLITTOCOPIES))->GetWindowText(szText); ((CEdit *)GetDlgItem(IDC_EDIT_SRCFILE))->GetWindowText(szFileName); ((CEdit *)GetDlgItem(IDC_EDIT_SPLITFILEDIR))->GetWindowText(szPath); nCopies = ::atoi(szText); if(!szPath.IsEmpty()) { if(szPath.Right(1) != "\\") { szPath += "\\"; } } if(!DirExists(szPath)) { if(LegalDir(szPath)) { CreateAllDir(szPath); } else { MessageBox("不能创建您提供的路径,请检查!", "分割提示", MB_OK + MB_ICONWARNING); return; } } if(nCopies > 1) { pa.cd =nCopies; char *fn=new char[50]; fn=szFileName.GetBuffer(szFileName.GetLength()); strcpy(pa.filename,fn); strcpy(pa.path,szPath); m_pg.SetRange(0,nCopies); m_pg.SetPos(0); //pa.path =(char*)szPath.GetBuffer(szPath.GetLength()); //SplitFile(szFileName, nCopies, szPath); hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SplitFile,(void*)this,0,&ThreadID); } else { MessageBox("请输入两个以上的分割份数!", "分割提示", MB_OK + MB_ICONWARNING); } } BOOL LoadSplitFileInfo(CString szFileName) { CFile file; if(file.Open(szFileName, CFile::modeRead | CFile::shareDenyWrite)) { CArchive arLoad(&file, CArchive::load); m_Split_Merge_FileList.RemoveAll(); m_Split_Merge_FileList.Serialize(arLoad); arLoad.Close(); file.Close(); return TRUE; } return FALSE; } BOOL MergeFile(LPVOID param) { CSplitFileDlg* pa; pa=(CSplitFileDlg*)param; CString szSplitInfoFile=pa->szf; if(!LoadSplitFileInfo(szSplitInfoFile)) { return FALSE; } int nPos; int nSplitFileCount = 0; DWORD dwFileLen; CFile fileRead,fileWrite; char *pszBuff = NULL; CString szFileName(""),szPath(""); CString szTemp(""); BOOL bRet = TRUE; POSITION pos = NULL; nSplitFileCount = m_Split_Merge_FileList.GetCount(); //////// pa->m_pg.SetRange(0,nSplitFileCount); pa->m_pg.SetPos(0); pa->m_btnMergeFile.EnableWindow(FALSE); pa->m_stop.EnableWindow(TRUE); //////// if(nSplitFileCount < 2) { return FALSE; } szTemp.Format(_T("%s"), szSplitInfoFile); nPos = szTemp.ReverseFind('.'); if(nPos != -1) { szFileName = szTemp.Left(nPos); } if(!fileWrite.Open(szFileName, CFile::modeCreate | CFile::typeBinary | CFile::modeWrite | CFile::shareExclusive)) { return FALSE; } nPos = szTemp.ReverseFind('\\'); if(nPos != -1) { szPath = szTemp.Left(nPos); } int k=0; for(pos=m_Split_Merge_FileList.GetHeadPosition(); NULL!=pos;) { SPLIT_MERGE_FILE splitfile; splitfile = m_Split_Merge_FileList.GetNext(pos); szFileName.Format(_T("%s\\%s"), szPath, splitfile.szFileName); // dwFileLen = splitfile.dwFileSize; pa->m_pg.SetPos(k); k++; if(!fileRead.Open(szFileName, CFile::modeRead | CFile::shareExclusive)) { bRet = FALSE; break; } dwFileLen = fileRead.GetLength(); fileRead.SeekToBegin(); pszBuff = new char[dwFileLen]; if(NULL != pszBuff) { fileRead.ReadHuge(pszBuff, dwFileLen); fileWrite.WriteHuge(pszBuff, dwFileLen); fileRead.Close(); DeleteFile(szFileName); delete []pszBuff; pszBuff = NULL; } } DeleteFile(szSplitInfoFile); fileWrite.Close(); return bRet; } void CSplitFileDlg::OnBtnMergefile() { // TODO: Add your control notification handler code here CString szFileName(""); ((CEdit *)GetDlgItem(IDC_EDIT_SPLITINFOFILE))->GetWindowText(szFileName); szf=szFileName; if(FileExists(szFileName)) { //MergeFile(szFileName); hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MergeFile,(void*)this,0,&ThreadID); } else { MessageBox("文件不存在,请检查!", "合并提示", MB_OK + MB_ICONWARNING); } } void CSplitFileDlg::OnBtnBrowsesplitfile() { // TODO: Add your control notification handler code here const char szFilters[]="All Files (*.*)|*.*||"; CWin2KFileDialog dlg(TRUE, "*.*", NULL,OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters); if(dlg.DoModal() == IDOK) { CString szFile(""),szText(""); DWORD dwFileSize; CFile file; szFile.Format(_T("%s"), dlg.GetPathName()); ((CEdit *)GetDlgItem(IDC_EDIT_SRCFILE))->SetWindowText(szFile); ((CStatic *)GetDlgItem(IDC_LBL_SRCFILESIZE))->SetWindowText(""); ((CEdit *)GetDlgItem(IDC_EDIT_SPLITTOCOPIES))->SetWindowText(""); ((CStatic *)GetDlgItem(IDC_LBL_SPLITFILESIZE))->SetWindowText(""); if(file.Open(szFile, CFile::modeRead)) { dwFileSize = file.GetLength(); file.Close(); szText.Format(_T("%d"), dwFileSize); ((CStatic *)GetDlgItem(IDC_LBL_SRCFILESIZE))->SetWindowText(szText); } } } void CSplitFileDlg::OnBtnBrowsemergefile() { // TODO: Add your control notification handler code here const char szFilters[]="Split info files (*.XX)|*.XX||"; CWin2KFileDialog dlg(TRUE, "XX", NULL,OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters); if(dlg.DoModal() == IDOK) { CString szFile(""); szFile.Format(_T("%s"), dlg.GetPathName()); ((CEdit *)GetDlgItem(IDC_EDIT_SPLITINFOFILE))->SetWindowText(szFile); } } BOOL CSplitFileDlg::FileExists(CString szFileName) { CString szFile(""); DWORD dwAttribute = -1; szFile.Format(_T("%s"), szFileName); dwAttribute = GetFileAttributes(szFile); if((dwAttribute == -1) || (dwAttribute == FILE_ATTRIBUTE_DIRECTORY)) { return FALSE; } return TRUE; } void CSplitFileDlg::OnChangeEditSrcfile() { int nPos; DWORD dwFileSize; CFile file; CString szFile(""),szText(""); CString szPath(""); ((CEdit *)GetDlgItem(IDC_EDIT_SRCFILE))->GetWindowText(szFile); ((CStatic *)GetDlgItem(IDC_LBL_SRCFILESIZE))->SetWindowText(""); ((CEdit *)GetDlgItem(IDC_EDIT_SPLITTOCOPIES))->SetWindowText(""); ((CStatic *)GetDlgItem(IDC_LBL_SPLITFILESIZE))->SetWindowText(""); if(file.Open(szFile, CFile::modeRead)) { dwFileSize = file.GetLength(); file.Close(); szText.Format(_T("%d"), dwFileSize); ((CStatic *)GetDlgItem(IDC_LBL_SRCFILESIZE))->SetWindowText(szText); } szPath = szFile; nPos = szPath.ReverseFind('\\'); if(nPos != -1) { szPath.Insert(nPos, '\0'); } ((CEdit *)GetDlgItem(IDC_EDIT_SPLITFILEDIR))->SetWindowText(szPath); } void CSplitFileDlg::OnChangeEditSplittocopies() { DWORD dwFileSize; int nSplitCopies,nSizePerCopy; CString szText(""); ((CStatic *)GetDlgItem(IDC_LBL_SRCFILESIZE))->GetWindowText(szText); ((CStatic *)GetDlgItem(IDC_LBL_SPLITFILESIZE))->SetWindowText(""); if(szText.IsEmpty()) { return; } dwFileSize = ::atoi(szText); ((CEdit *)GetDlgItem(IDC_EDIT_SPLITTOCOPIES))->GetWindowText(szText); nSplitCopies = ::atoi(szText); if(nSplitCopies > 1) { nSizePerCopy = dwFileSize / nSplitCopies; szText.Format(_T("%d"), nSizePerCopy); ((CStatic *)GetDlgItem(IDC_LBL_SPLITFILESIZE))->SetWindowText(szText); } } BOOL CSplitFileDlg::SelectDirectory(CString &szDir, CString szTitle) { char szPath[MAX_PATH]; BROWSEINFO bi; ITEMIDLIST *pidl; BOOL bRet=TRUE; bi.hwndOwner = NULL; bi.pidlRoot = NULL; bi.pszDisplayName = szPath; bi.lpszTitle = szTitle; bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; pidl = SHBrowseForFolder(&bi); if(pidl == NULL) { szPath[0] = 0; bRet = FALSE; } if(!SHGetPathFromIDList(pidl, szPath)) { szPath[0] = 0; bRet = FALSE; } szDir.Format(_T("%s"), szPath); return bRet; } void CSplitFileDlg::OnBtnSplitfiledir() { // TODO: Add your control notification handler code here CString szDir(""); if(SelectDirectory(szDir, "请选择文件分割后要保存的目录:")) { ((CEdit *)GetDlgItem(IDC_EDIT_SPLITFILEDIR))->SetWindowText(szDir); } } int CSplitFileDlg::GetDirLevelCount(CString szDir) { CString szPath(""); int nDirLevel = 0; int nDirLen = 0; int nPos = -1; szPath.Format(_T("%s"), szDir); if(szPath.IsEmpty()) { return -1; } if(szPath.Mid(1, 1) != ":") {//不是路径 return -1; } if(szPath.Right(1) == "\\") { szPath = szPath.Left(szPath.GetLength() - 1); } nDirLen = szPath.GetLength(); for(int i=0; i nLevelCount)) { return FALSE; } if(nLevel == nLevelCount) { szGetDir = szPath; } else { for(i=0; i = 'a') && (chDrive <= 'z')) || ((chDrive >= 'A') && (chDrive <= 'Z'))) { if(nDirLen == 2) { szTemp = szPath.Mid(1, 1); if(szTemp == ":") { return TRUE; } } else { szTemp = szPath.Mid(1, 2); if(szTemp == ":\\") { return TRUE; } } } return FALSE; } void CSplitFileDlg::OnButton1() { // TODO: Add your control notification handler code here TerminateThread(hThread,1); m_stop.EnableWindow(FALSE); m_btnSplitFile.EnableWindow(TRUE); m_btnMergeFile.EnableWindow(TRUE); }