#include "stdafx.h" #include "NxFileSystemTool.h" #include "NxFileSystemToolDlg.h" #include "NewFolderDlg.h" #include "ExportBrowseFolder.h" #include "WorkDialog.h" #include "BuildDivisionPacking.h" #include "BuildDivisionPackingCapacity.h" #include "LogWnd.h" #include "SundriesFunc.h" #include "SHFolderDialog.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif #pragma warning(disable:4311) // ÀÀ¿ë ÇÁ·Î±×·¥ Á¤º¸¿¡ »ç¿ëµÇ´Â CAboutDlg ´ëÈ­ »óÀÚÀÔ´Ï´Ù. class CAboutDlg : public CDialog { public: CAboutDlg(); // ´ëÈ­ »óÀÚ µ¥ÀÌÅÍ enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Áö¿ø // ±¸Çö protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CNxFileSystemToolDlg ´ëÈ­ »óÀÚ CNxFileSystemToolDlg::CNxFileSystemToolDlg(CWnd* pParent /*=NULL*/) : CDialog(CNxFileSystemToolDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_iOverwriteType = -1; } void CNxFileSystemToolDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_FILE_LIST, m_FileList); DDX_Control(pDX, IDC_NAVI , m_Edit); } BEGIN_MESSAGE_MAP(CNxFileSystemToolDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_WM_SIZE() ON_COMMAND(ID_LOADSYSTEM, OnLoadsystem) ON_COMMAND(ID_NEWSYSTEM, OnNewsystem) ON_COMMAND(ID_FILESYSTEM_CLOSE, OnFilesystemClose) ON_COMMAND(ID_INSERT_FILE, OnInsertFile) ON_MESSAGE(WM_COMPLETE_MSG, OnCompleteMsg) ON_MESSAGE(WM_COMPLETE_OPTIMIZE, OnComplete_Optimize) ON_MESSAGE(WM_COMPLETE_EXPORT, OnComplete_Export) ON_COMMAND(ID_NEW_FOLDER, OnNewFolder) ON_COMMAND(ID_REMOVE, OnRemove) ON_NOTIFY(NM_DBLCLK, IDC_FILE_LIST, OnNMDblclkFileList) ON_NOTIFY(LVN_ENDLABELEDIT, IDC_FILE_LIST, OnLvnEndlabeleditFileList) ON_COMMAND(ID_IPAC_EXIT, OnIpacExit) ON_COMMAND(ID_OPTIMIZE, OnOptimize) ON_COMMAND(ID_RENAME, OnRename) ON_COMMAND(ID_EXPORT, OnExport) ON_COMMAND(ID_ABOUT, OnAbout) ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) ON_COMMAND(ID_MENU_DIV_PACKING, &CNxFileSystemToolDlg::OnMenuDivPacking) ON_COMMAND(ID_MENU_DIV_PACKING_CAPACITY, &CNxFileSystemToolDlg::OnMenuDivPackingCapacity) ON_COMMAND(ID_PATCH, &CNxFileSystemToolDlg::OnPatch) ON_MESSAGE(WM_COMPLETE_PATCH, OnCompletePatch) ON_COMMAND(ID_COMPARE, &CNxFileSystemToolDlg::OnCompare) ON_COMMAND(ID_INSERT_FOLDER, &CNxFileSystemToolDlg::OnInsertFolder) END_MESSAGE_MAP() // CNxFileSystemToolDlg ¸Þ½ÃÁö 󸮱â BOOL CNxFileSystemToolDlg::OnInitDialog() { CDialog::OnInitDialog(); // ½Ã½ºÅÛ ¸Þ´º¿¡ "Á¤º¸..." ¸Þ´º Ç׸ñÀ» Ãß°¡ÇÕ´Ï´Ù. // IDM_ABOUTBOX´Â ½Ã½ºÅÛ ¸í·É ¹üÀ§¿¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. 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); } } // ÀÌ ´ëÈ­ »óÀÚÀÇ ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÁÖ Ã¢ÀÌ ´ëÈ­ »óÀÚ°¡ ¾Æ´Ò °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©°¡ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. SetIcon(m_hIcon, TRUE); // Å« ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. SetIcon(m_hIcon, FALSE); // ÀÛÀº ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. // TODO: ¿©±â¿¡ Ãß°¡ ÃʱâÈ­ ÀÛ¾÷À» Ãß°¡ÇÕ´Ï´Ù. m_FileList.DragAcceptFiles(); m_FileList.SetExtendedStyle(LVS_EX_FULLROWSELECT); RECT Rect; m_FileList.GetWindowRect(&Rect); const int COLUMN_WIDTH_GAB = 4; const int SIZECOLUMN_WIDTH = 300; const int SIZECOLUMN_WIDTH2 = 80; m_FileList.InsertColumn(0,_T("À̸§"),LVCFMT_LEFT,SIZECOLUMN_WIDTH); m_FileList.InsertColumn(1,_T("Å©±â"),LVCFMT_LEFT,SIZECOLUMN_WIDTH2); m_FileList.InsertColumn(2,_T("¿øº»Å©±â"),LVCFMT_LEFT,SIZECOLUMN_WIDTH2); m_FileList.InsertColumn(3,_T("¼³¸í"),LVCFMT_LEFT,SIZECOLUMN_WIDTH); m_ImageList.Create(IDB_FILE_LIST_ICON,16,2,RGB(0,255,0)); m_FileList.SetImageList(&m_ImageList,LVSIL_SMALL); m_bWorking = false; // ÀÛ¾÷ÁßÀÎÁö ¾Æ´ÑÁö.. ÃʱâÈ­ m_FileList.SetFocus(); // LogWnd::CreateLog(); return TRUE; // ÄÁÆ®·Ñ¿¡ ´ëÇÑ Æ÷Ä¿½º¸¦ ¼³Á¤ÇÏÁö ¾ÊÀ» °æ¿ì TRUE¸¦ ¹ÝȯÇÕ´Ï´Ù. } void CNxFileSystemToolDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // ´ëÈ­ »óÀÚ¿¡ ÃÖ¼ÒÈ­ ´ÜÃ߸¦ Ãß°¡ÇÒ °æ¿ì ¾ÆÀÌÄÜÀ» ±×¸®·Á¸é // ¾Æ·¡ Äڵ尡 ÇÊ¿äÇÕ´Ï´Ù. ¹®¼­/ºä ¸ðµ¨À» »ç¿ëÇÏ´Â MFC ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. void CNxFileSystemToolDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // ±×¸®±â¸¦ À§ÇÑ µð¹ÙÀ̽º ÄÁÅØ½ºÆ® SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // Ŭ¶óÀÌ¾ðÆ® »ç°¢Çü¿¡¼­ ¾ÆÀÌÄÜÀ» °¡¿îµ¥¿¡ ¸ÂÃä´Ï´Ù. 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; // ¾ÆÀÌÄÜÀ» ±×¸³´Ï´Ù. dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // »ç¿ëÀÚ°¡ ÃÖ¼ÒÈ­µÈ âÀ» ²ô´Â µ¿¾È¿¡ Ä¿¼­°¡ Ç¥½ÃµÇµµ·Ï ½Ã½ºÅÛ¿¡¼­ // ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. HCURSOR CNxFileSystemToolDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } BOOL CNxFileSystemToolDlg::PreTranslateMessage(MSG* pMsg) { switch(pMsg->wParam) { case VK_ESCAPE: pMsg->wParam=NULL; // ESC ´Â ¹«½ÃÇÑ´Ù. break; case VK_RETURN: pMsg->wParam=NULL; // ¿£Å͵µ ¹«½ÃÇÑ´Ù. break; } switch(pMsg->message) { case WM_DROPFILES: if(pMsg->hwnd == m_FileList.GetSafeHwnd()) DropFile((HDROP)pMsg->wParam); break; case WM_KEYDOWN: if(pMsg->hwnd == m_FileList.GetSafeHwnd() && pMsg->wParam == VK_DELETE) OnRemove(); break; } return CDialog::PreTranslateMessage(pMsg); } void CNxFileSystemToolDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); const int SIZECOLUMN_WIDTH = 300; const int SIZECOLUMN_WIDTH2 = 60; CRect rt; // TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if (m_FileList.GetSafeHwnd() != NULL ) { m_FileList.SetWindowPos(NULL,10,35,cx-22,cy-48,SWP_NOZORDER); //Client ¿µ¿ªÀÇ Å©±â¸¦ ±¸ÇÑ´Ù. m_FileList.GetClientRect(&rt); } } static int CALLBACK FileListItemSortFunc(LPARAM lParam1,LPARAM lParam2,LPARAM /*lParamSort*/) { SNxFileInfo* pFH1 = (SNxFileInfo*)lParam1; SNxFileInfo* pFH2 = (SNxFileInfo*)lParam2; CString strItem1; if(pFH1->nFileType == NFS_DIR) { strItem1.Format(_T("!%s"),pFH1->szFileName); } else { strItem1 = pFH1->szFileName; } CString strItem2; if(pFH2->nFileType == NFS_DIR) { strItem2.Format(_T("!%s"),pFH2->szFileName); } else { strItem2 = pFH2->szFileName; } return _tcscmp(strItem1,strItem2); } void CNxFileSystemToolDlg::UpdateFileList() { m_FileList.DeleteAllItems(); int i; CString strFileSize; CString OriFileSize; std::vector< SPackingFileInfo * > vecFileInfo; std::vector< std::string > vecDirList; g_FileSystem.GetFileInfoListCurDir( vecFileInfo ); g_FileSystem.GetDirListCurDir( vecDirList ); m_vecFileInfo.resize( vecFileInfo.size() + vecDirList.size() ); for( i = 0; i < ( int )vecFileInfo.size(); i++ ) { _GetFullFileName( m_vecFileInfo[ i ].szFileName, _countof(m_vecFileInfo[ i ].szFileName), vecFileInfo[ i ]->szFileName ); m_vecFileInfo[ i ].dwCompressSize = vecFileInfo[ i ]->dwCompressSize; m_vecFileInfo[ i ].dwOriginalSize = vecFileInfo[ i ]->dwOriginalSize; m_vecFileInfo[ i ].nFileType = NFS_FILE; } for( i = 0; i < ( int )vecDirList.size(); i++ ) { strcpy_s( m_vecFileInfo[ vecFileInfo.size() + i ].szFileName, _MAX_PATH, vecDirList[ i ].c_str() ); m_vecFileInfo[ vecFileInfo.size() + i ].nFileType = NFS_DIR; } for( i = 0; i < ( int )m_vecFileInfo.size(); i++ ) { m_FileList.InsertItem( i, m_vecFileInfo[ i ].szFileName, 1 ); m_FileList.SetItemData( i, ( DWORD )( &m_vecFileInfo[ i ] ) ); if( m_vecFileInfo[ i ].nFileType == NFS_FILE ) { strFileSize.Format(_T("%dKB"),( m_vecFileInfo[ i ].dwCompressSize + 999 ) / 1000 ); m_FileList.SetItemText(i,1,LPCTSTR(strFileSize)); OriFileSize.Format(_T("%dKB"),( m_vecFileInfo[ i ].dwOriginalSize + 999 ) / 1000 ); m_FileList.SetItemText(i,2,LPCTSTR(OriFileSize)); } } m_FileList.SortItems(FileListItemSortFunc,NULL); this->SetDlgItemText(IDC_NAVI,g_FileSystem.GetCurDir()); } void CNxFileSystemToolDlg::OnLoadsystem() { if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return ; } CFileDialog Dlg(TRUE,_T(".pak"),NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("ÆÄÀÏ(*.pak)|*.pak||"),NULL); if(Dlg.DoModal() == IDCANCEL) return; if(!g_FileSystem.OpenFileSystem(LPCTSTR(Dlg.GetPathName()))) { // ÆÄÀÏ ½Ã½ºÅÛ ¾²±â·Î ¾È¿­¸®¸é Àбâ·Î¶óµµ ¿¬´Ù.. if( !g_FileSystem.OpenFileSystem(LPCTSTR(Dlg.GetPathName()), true )) { AfxMessageBox(_T("ÆÄÀϽýºÅÛÀ» ¿­Áö ¸øÇÏ¿´°Å³ª À߸øµÈ ÆÄÀÏ ÀÔ´Ï´Ù.")); return; } } m_strPath = Dlg.GetPathName(); UpdateFileList(); } void CNxFileSystemToolDlg::OnNewsystem() { if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return ; } CFileDialog Dlg(FALSE,_T(".Nfs"),_T("NewSystem.pak"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("ÆÄÀÏ(*.pak)|*.pak||"),NULL); if(Dlg.DoModal() == IDCANCEL) return; if(!g_FileSystem.NewFileSystem(LPCTSTR(Dlg.GetPathName()))) { AfxMessageBox(_T("»õ·Î¿î ÆÄÀϽýºÅÛ »ý¼º¿¡ ½ÇÆÐ ÇÏ¿´½À´Ï´Ù.")); return; } if(!g_FileSystem.OpenFileSystem(LPCTSTR(Dlg.GetPathName()))) { AfxMessageBox(_T("»õÆÄÀÏ ½Ã½ºÅÛÀ» »ý¼ºÇÏ¿´Áö¸¸ ·ÎµåÇÏÁö ¸øÇÏ¿´½À´Ï´Ù.")); return; } m_strPath = Dlg.GetPathName(); UpdateFileList(); } void CNxFileSystemToolDlg::OnFilesystemClose() { if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return ; } // TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. g_FileSystem.CloseFileSystem(); m_strPath.Empty(); UpdateFileList(); } BOOL CNxFileSystemToolDlg::DestroyWindow() { // TODO: ¿©±â¿¡ Ư¼öÈ­µÈ Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº» Ŭ·¡½º¸¦ È£ÃâÇÕ´Ï´Ù. SAFE_DELETE (g_pAddThread); return CDialog::DestroyWindow(); } LRESULT CNxFileSystemToolDlg::OnCompleteMsg(WPARAM wParam, LPARAM lParam) { SAFE_DELETE (g_pAddThread); m_bWorking = false; ::PostMessage(g_pWorking->GetSafeHwnd(),WM_DESTROY,0,0); SAFE_DELETE(g_pWorking); UpdateFileList(); return TRUE; } void CNxFileSystemToolDlg::OnInsertFile() { if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return; } // TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if(!m_FileList.GetItemCount()) { AfxMessageBox(_T("ÆÄÀϽýºÅÛÀÌ »ý¼ºµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.")); return; } CFileDialog Dlg(TRUE); if(Dlg.DoModal() == IDCANCEL) return; TCHAR strName[_MAX_FNAME]; g_FileSystem.GetNameOnly(strName,Dlg.GetPathName().GetBuffer()); /* if(g_FileSystem.CheckNameExist(strName)) { if(AfxMessageBox(_T("µ¿ÀÏÇÑ À̸§ÀÇ ÆÄÀÏÀÌ ÀÌ¹Ì Á¸ÀçÇÕ´Ï´Ù.\n\n¸ðµç ÆÄÀÏÀ» »õ·Î¿î ÆÄÀÏ·Î µ¤¾î¾²½Ã·Á¸é '¿¹' ¸¦\n\n¸ðµç ±âÁ¸ÀÇ ÆÄÀÏÀ» º¸Á¸ÇϽ÷Á¸é '¾Æ´Ï¿À' ¸¦ ´­·¯ÁֽʽÿÀ! "),MB_YESNO) == IDNO) return; g_FileSystem.Remove(strName); }*/ // ¾È³» ¹Ú½º.. ¶ç¿ì±â.. DrawWorking(); AddFileInfo add; add.FileName = LPCTSTR( Dlg.GetPathName() ); add.FilePath = g_FileSystem.GetCurDir(); g_AddFileList.push_back(add); // ÆÄÀÏ Ãß°¡ ¾²·¹½º ½ÃÀÛ! g_pAddThread = new CFileImportThread(this->GetSafeHwnd()); g_pAddThread->Start(); m_bWorking = true; } void CNxFileSystemToolDlg::OnInsertFolder() { if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return; } // TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if(!m_FileList.GetItemCount()) { AfxMessageBox(_T("ÆÄÀϽýºÅÛÀÌ »ý¼ºµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.")); return; } CString strSelectedPath; if( !CSHFolderDialog::BrowseForFolder( strSelectedPath, _T("Choose a Folder:"), m_hWnd, 0, 0, NULL ) == IDOK ) { return; } SearchFolderAndAddFile( strSelectedPath.GetBuffer() ); // ¾È³» ¹Ú½º.. ¶ç¿ì±â.. DrawWorking(); // ÆÄÀÏ Ãß°¡ ¾²·¹½º ½ÃÀÛ! g_pAddThread = new CFileImportThread(this->GetSafeHwnd()); g_pAddThread->Start(); m_bWorking = true; } void CNxFileSystemToolDlg::SearchFolderAndAddFile( const char *szFolderName ) { char acCommonBuffer[1024]; sprintf(acCommonBuffer, szFolderName); strcat(acCommonBuffer, "/*.*"); HANDLE hSearchFile; WIN32_FIND_DATA wfd; BOOL bResult = TRUE; // Æú´õ¾È¿¡ ÀÖ´Â ÆÄÀÏÀ» ã¾Æ ¼øÈ¸ÇÑ´Ù. hSearchFile = FindFirstFile(acCommonBuffer, &wfd); if (hSearchFile == INVALID_HANDLE_VALUE) return; std::string strSubFolder; std::string::size_type szLength; if( m_strRootFolder.length() == 0 ) { std::string strTemp = szFolderName; szLength = strTemp.rfind( "\\" ); strTemp.erase( szLength ); m_strRootFolder = strTemp; } std::string strFolderName = szFolderName; strFolderName.erase( 0, m_strRootFolder.length() ); strSubFolder = strFolderName + "\\"; // ¹º°¡ ã¾Ò´Ù¸é, while (bResult) { // ÆÄÀÏ ¼ø¼­´Â Ç×»ó ¿µ¾îÀ̸§ ¼øÀÌ´Ù. Æú´õ¿Í ÆÄÀÏ ±¸ºÐ ¾ø´Ù. if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // ¸ðµç Æú´õ¿¡´Â Ç×»ó . °ú .. Æú´õ°¡ ÀÖ´Ù. ÀÌ°Ç ±×³É ³Ñ±â°í, ´Ù¸¥ Æú´õ¶ó¸é, if (wfd.cFileName[0] != '.') { // Àç±ÍÈ£Ãâ·Î ó¸®ÇÑ´Ù. sprintf(acCommonBuffer, "%s\\%s", szFolderName, wfd.cFileName); SearchFolderAndAddFile(acCommonBuffer); } } else { if (_stricmp(wfd.cFileName, "Thumbs.db")) { // ÆÄÀϸí Á¶ÇÕ sprintf(acCommonBuffer, "%s\\%s", szFolderName, wfd.cFileName); // ÆÄÀÏ Å©±â°¡ 0ÀÌ ¾Æ´Ñ °æ¿ì¿¡¸¸ Ãß°¡ÇÑ´Ù. ÆÄÀÏÅ©±â 0Àº Àǹ̾ø´Â ÆÄÀÏÀÌ´Ù. HANDLE hFile = CreateFile(acCommonBuffer, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (GetFileSize(hFile, NULL) != 0) { AddFileInfo add; add.FileName = acCommonBuffer; add.FilePath = strSubFolder; g_AddFileList.push_back(add); } CloseHandle(hFile); } } bResult = FindNextFile(hSearchFile, &wfd); } FindClose(hSearchFile); } void CNxFileSystemToolDlg::OnNewFolder() { // TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return; } if(!m_FileList.GetItemCount()) { AfxMessageBox(_T("ÆÄÀϽýºÅÛÀÌ »ý¼ºµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.")); return; } CNewFolderDlg Dlg; if(Dlg.DoModal() == IDCANCEL) return; if(Dlg.m_strFolderName.IsEmpty()) return; // g_FileSystem.AddDirWithChange(LPCTSTR(Dlg.m_strFolderName)); UpdateFileList(); } void CNxFileSystemToolDlg::OnRemove() { if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return; } if(!m_FileList.GetItemCount()) { AfxMessageBox(_T("ÆÄÀϽýºÅÛÀÌ »ý¼ºµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.")); return; } if(!m_FileList.GetSelectedCount()) return; if(AfxMessageBox(_T("¼±ÅÃµÈ ÆÄÀÏ È¤Àº Æú´õ¸¦ »èÁ¦ÇϽðڽÀ´Ï±î?"), MB_YESNO) == IDYES) { CStringArray strRemove; POSITION Pos = m_FileList.GetFirstSelectedItemPosition(); while(Pos) { int iItem = m_FileList.GetNextSelectedItem(Pos); SNxFileInfo* NxFileInfo = (SNxFileInfo*)m_FileList.GetItemData(iItem); strRemove.Add(NxFileInfo->szFileName); } for(int i=0;iiItem >= 0) { SNxFileInfo *pFH = ( SNxFileInfo * )m_FileList.GetItemData(pNMItemActivate->iItem); if( pFH->nFileType == NFS_DIR) { g_FileSystem.ChangeDir(pFH->szFileName); UpdateFileList(); } } *pResult = 0; } void CNxFileSystemToolDlg::OnLvnEndlabeleditFileList(NMHDR *pNMHDR, LRESULT *pResult) { if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return; } NMLVDISPINFO *pDispInfo = reinterpret_cast(pNMHDR); if(!pDispInfo->item.pszText) return; SNxFileInfo *pFH = ( SNxFileInfo * )m_FileList.GetItemData(pDispInfo->item.iItem); if(!g_FileSystem.Rename(pFH->szFileName,pDispInfo->item.pszText)) { AfxMessageBox(_T("¼±ÅÃµÈ ÆÄÀÏ È¤Àº Æú´õÀÇ À̸§À» º¯°æÇÒ¼ö ¾ø½À´Ï´Ù!")); return; } m_FileList.SetItemText(pDispInfo->item.iItem,0,pDispInfo->item.pszText); *pResult = 0; } void CNxFileSystemToolDlg::DropFile(HDROP hDrop) { if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return; } g_AddFileList.clear(); if(!m_FileList.GetItemCount()) { AfxMessageBox(_T("ÆÄÀϽýºÅÛÀÌ »ý¼ºµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.")); return; } if ( AfxMessageBox(_T("µå·¡±×ÇÑ ÆÄÀÏ¹× Æú´õ¸¦ ÆÄÀϽýºÅÛ¿¡ ÀúÀåÇϽðڽÀ´Ï±î?") , MB_YESNO) == IDNO ) return; // ¾È³» ¹Ú½º.. ¶ç¿ì±â.. DrawWorking(); /* UINT DragQueryFile( HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch ); iFileÀÇ °ªÀÌ 0xFFFFFFFFÀÏ °æ¿ì¿¡´Â ¸®ÅϰªÀ¸·Î ¸î °³ÀÇ ÆÄÀÏÀÌ µå·ÓµÇ¾ú´ÂÁö¸¦ Á¤¼öÇüÀ¸·Î ¹Ýȯ ¶Ç, iFile°ªÀÌ 0°ú µå·ÓµÈ Àüü ÆÄÀϼö»çÀÌÀÇ °ªÀ̰í, lpszFileÀÌ NULLÀÎ °æ¿ì¿¡´Â nullÀ» Æ÷ÇÔÇÏÁö ¾Ê´Â ÇÊ¿äÇÑ Ä³¸¯ÅÍ Å©±â¸¦ ¸®ÅÏ hDrop : µå·ÓÆÄÀÏ Áö½ÃÀÚ iFile : ÆÄÀÏ Äõ¸®¿¡ ´ëÇÑ À妽º¸¦ ³ªÅ¸³»¸ç, ÀÌ °ª¿¡ ÀÇÇØ ÇÊ¿äÇÑ Äõ¸®°¡ º¯ÇÕ´Ï´Ù. lpszFile : ÆÐ½º¸íÀ» ¹Þ¾Æµå¸± ¹öÆÛ(½ºÆ®¸µÇü) cch : ¹öÆÛÀÇ Å©±â */ int iCount = DragQueryFile(hDrop,0xFFFFFFFF,NULL,0); // ÆÄÀÏÀÇ °¹¼ö¸¦ ±¸ÇÑ´Ù. TCHAR strPath[_MAX_PATH]; for(int i=0;iGetSafeHwnd()); g_pAddThread->Start(); m_bWorking = true; } BOOL CNxFileSystemToolDlg::DropFolder(const TCHAR* strPath) { if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return FALSE; } char *pFindPtr = strstr( ( char * )strPath, ".svn" ); if( pFindPtr ) { if( _stricmp( pFindPtr, ".svn" ) == 0 ) { return FALSE; } } TCHAR strOldPath[_MAX_PATH]; GetCurrentDirectory(_MAX_PATH,strOldPath); // ÇöÀç ÀÌ ÇÁ·Î±×·¥ÀÌ ½ÇÇàÁßÀÎ µð·ºÅ丮¸¦ ¾Ë¾Æ³½´Ù. SetCurrentDirectory(strPath); // µå·ÓÇÒ Æú´õ·Î À̵¿.?? TCHAR strName[_MAX_FNAME]; g_FileSystem.GetNameOnly(strName,strPath); /* if(!g_FileSystem.CheckNameExist(strName)) { g_FileSystem.AddDir(strName); }*/ if(!g_FileSystem.ChangeDir(strName)) return FALSE; CFileFind FileFind; if(FileFind.FindFile()) { for(BOOL bNext=TRUE;bNext;) { bNext = FileFind.FindNextFile(); CString strP = FileFind.GetFilePath(); CString strN = FileFind.GetFileName(); if(strN == "." || strN == "..") continue; if(FileFind.IsDirectory()) { DropFolder(LPCTSTR(strP)); } else { /* if(g_FileSystem.CheckNameExist(strN)) { if(m_iOverwriteType < 0) m_iOverwriteType = AfxMessageBox(_T("µ¿ÀÏÇÑ À̸§ÀÇ ÆÄÀÏÀÌ ÀÌ¹Ì Á¸ÀçÇÕ´Ï´Ù.\n\n¸ðµç ÆÄÀÏÀ» »õ·Î¿î ÆÄÀÏ·Î µ¤¾î¾²½Ã·Á¸é '¿¹' ¸¦\n\n¸ðµç ±âÁ¸ÀÇ ÆÄÀÏÀ» º¸Á¸ÇϽ÷Á¸é '¾Æ´Ï¿À' ¸¦ ´­·¯ÁֽʽÿÀ!"),MB_YESNO); if(m_iOverwriteType == IDNO) continue; g_FileSystem.Remove(strN); }*/ // ÆÄÀÏ Ãß°¡.. AddFileInfo add; add.FileName = strP; add.FilePath = g_FileSystem.GetCurDir(); g_AddFileList.push_back(add); } } } FileFind.Close(); g_FileSystem.ChangeDir(_T("..")); SetCurrentDirectory(strOldPath); return TRUE; } void CNxFileSystemToolDlg::OnIpacExit() { // TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.\n\nÁ¶±Ý¸¸ ±â´Ù·ÁÁÖ½Ã¸é ¾ÈµÉ±î¿ä..? \n\nÈæÈæ...")); return; } PostQuitMessage(0); } void CNxFileSystemToolDlg::OnOptimize() { // TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.\n\nÁ¶±Ý¸¸ ±â´Ù·ÁÁÖ½Ã¸é ¾ÈµÉ±î¿ä..? \n\nÈæÈæ...")); return; } if(!m_FileList.GetItemCount()) { AfxMessageBox(_T("ÆÄÀϽýºÅÛÀÌ »ý¼ºµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.")); return; } // ¾È³» ¹Ú½º.. ¶ç¿ì±â.. DrawWorking(); // ÆÄÀÏ Ãß°¡ ¾²·¹½º ½ÃÀÛ! g_pOptimizeThread = new COptimizeThread(this->GetSafeHwnd() , m_strPath); //OptimizeThread->Start(); g_pOptimizeThread->Run(); m_bWorking = true; } LRESULT CNxFileSystemToolDlg::OnComplete_Optimize(WPARAM wParam, LPARAM lParam) { SAFE_DELETE (g_pOptimizeThread); g_FileSystem.ChangeDir(_T("/")); m_bWorking = false; ::PostMessage(g_pWorking->GetSafeHwnd(),WM_DESTROY,0,0); SAFE_DELETE(g_pWorking); AfxMessageBox(_T("ÃÖÀûÈ­ ÀÛ¾÷À» ¼º°øÇß½À´Ï´Ù.\n\n¿À·¡±â´Þ·Ç½´~")); UpdateFileList(); return TRUE; } LRESULT CNxFileSystemToolDlg::OnComplete_Export(WPARAM wParam, LPARAM lParam) { SAFE_DELETE (g_pExportThread); ::PostMessage(g_pWorking->GetSafeHwnd(),WM_DESTROY,0,0); SAFE_DELETE(g_pWorking); AfxMessageBox(_T("ÆÄÀÏ ÃßÃâ ÀÛ¾÷ÀÌ ¿Ï·á µÇ¾ú½À´Ï´Ù.")); UpdateFileList(); m_bWorking = false; return TRUE; } void CNxFileSystemToolDlg::OnRename() { ; } using namespace std; typedef list CValueFileHandleList; typedef list::iterator CValueFileHandleList_It; void CNxFileSystemToolDlg::OnExport() { // TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. if ( m_bWorking ) { AfxMessageBox(_T("¾ÆÁ÷ ÀÛ¾÷ÀÌ ÁøÇàÁßÀÔ´Ï´Ù.")); return; } if(!m_FileList.GetItemCount()) { AfxMessageBox(_T("ÆÄÀϽýºÅÛÀÌ »ý¼ºµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.")); return; } if(!m_FileList.GetSelectedCount()) return; if ( AfxMessageBox(_T("¼±ÅÃµÈ ÆÄÀÏ È¤Àº Æú´õ¸¦ ¿ÜºÎ·Î ÃßÃâÇϽðڽÀ´Ï±î?"), MB_YESNO) == IDNO) return; TCHAR strOldPath[_MAX_PATH]= { 0 , }; // GetCurrentDirectory(_MAX_PATH,strOldPath); // ÇöÀç µð·ºÅ丮¸¦ ¾Ë¾Æ³½´Ù. if ( ExportBrowseFolder(GetSafeHwnd(),strOldPath) == FALSE ) return; CString CurPath; CString ExportPath; CurPath = strOldPath; ExportPath = CurPath + _T("\\Exports"); // ¼±ÅÃÇÑ °æ·Î + Exports Æú´õ ¸¸µé±â CreateDirectory(ExportPath,NULL); // ÀͽºÆ÷Æ® ÇÒ Æú´õ·Î À̵¿ SetCurrentDirectory(ExportPath); // ¾È³» ¹Ú½º.. ¶ç¿ì±â.. DrawWorking(); g_ExportList.clear(); POSITION Pos = m_FileList.GetFirstSelectedItemPosition(); CValueFileHandleList OriginalValue; while(Pos) { int iItem = m_FileList.GetNextSelectedItem(Pos); SNxFileInfo *pFH = ( SNxFileInfo * )m_FileList.GetItemData(iItem); if( *(pFH->szFileName) == _T('.') ) continue; SNxFileInfo FH = *pFH; // Value Copy OriginalValue.push_back(FH); } CValueFileHandleList_It tempit=OriginalValue.begin(); for(tempit ; tempit!=OriginalValue.end() ; ++tempit ) { SNxFileInfo FH = (SNxFileInfo)(*tempit); ExportInfo add; add.FileType = FH.nFileType; add.Name = FH.szFileName; add.FilePath = g_FileSystem.GetCurDir(); g_ExportList.push_back(add); if ( FH.nFileType == NFS_DIR ) { tstring name = FH.szFileName; FolderExport(name); g_FileSystem.ChangeDir(_T("..")); } } // ÆÄÀÏ ·Î±×¸¦ ³²°Ü º¸¾Æ¿ä~ ExportInfoList_It Export_It = g_ExportList.begin(); //@Log.LogInfo(L"###### ŸÀÔ 0 ¹øÀÌ¸é Æú´õ 1¹øÀÌ¸é ÆÄÀÏ ######"); for (Export_It ; Export_It != g_ExportList.end() ; ++Export_It ) { tstring name = (*Export_It).Name; tstring FilePath = (*Export_It).FilePath; int FileType = (*Export_It).FileType; //@Log.LogInfo(L"À̸§:[%s] , °æ·Î:[%s] , ÆÄÀÏŸÀÔ: [%d] ",name.c_str(),FilePath.c_str(),FileType); } // ¸ñ·ÏÀ» ´Ù »Ì¾ÒÀ¸´Ï ¾²·¹µå¸¦ ½ÃÀÛÇØº¼±î!! g_pExportThread = new CFileExportThread(this->GetSafeHwnd() , ExportPath); g_pExportThread->Start(); m_bWorking = true; OriginalValue.clear(); } void CNxFileSystemToolDlg::FolderExport(tstring FolderName) { if ( g_FileSystem.ChangeDir(FolderName.c_str()) == FALSE) { return; } std::vector< SPackingFileInfo * > vecFileInfo; std::vector< std::string > vecDirList; g_FileSystem.GetDirListCurDir( vecDirList ); g_FileSystem.GetFileInfoListCurDir( vecFileInfo ); int i; for( i = 0; i < ( int )vecFileInfo.size(); i++ ) { if( vecFileInfo[ i ]->dwCompressSize > 0 ) { ExportInfo add; add.FileType = NFS_FILE; add.Name = vecFileInfo[ i ]->szFileName; add.FilePath = g_FileSystem.GetCurDir(); g_ExportList.push_back(add); } } for( i = 0; i < ( int )vecDirList.size(); i++ ) { if( _stricmp( vecDirList[ i ].c_str(), "." ) == 0 ) { continue; } if( _stricmp( vecDirList[ i ].c_str(), ".." ) == 0 ) { continue; } FolderExport( vecDirList[ i ].c_str() ); } g_FileSystem.ChangeDir( ".." ); } void CNxFileSystemToolDlg::OnAbout() { // TODO: ¿©±â¿¡ ¸í·É 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. CAboutDlg dlgAbout; dlgAbout.DoModal(); } void CNxFileSystemToolDlg::OnBnClickedButton1() { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. CString Path; this->GetDlgItemText(IDC_NAVI,Path); if( g_FileSystem.ChangeDir((LPTSTR)(LPCTSTR)Path) ) { UpdateFileList(); } } void CNxFileSystemToolDlg::OnMenuDivPacking() { // TODO: Add your command handler code here BuildDivisionPacking dlg; dlg.DoModal(); } void CNxFileSystemToolDlg::OnMenuDivPackingCapacity() { // TODO: Add your command handler code here BuildDivisionPackingCapacity dlg; dlg.DoModal(); } void CNxFileSystemToolDlg::OnPatch() { // TODO: Add your command handler code here if(!m_FileList.GetItemCount()) { AfxMessageBox(_T("ÆÄÀϽýºÅÛÀÌ »ý¼ºµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.\n¿øº»ÆÐÅ·ÆÄÀÏÀ» ·ÎµåÇØÁÖ¼¼¿ä.")); return; } CFileDialog Dlg(TRUE,_T(".pak"),NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("ÆÄÀÏ(*.pak)|*.pak||"),NULL); if(Dlg.DoModal() == IDCANCEL) return; DrawWorking(); // ÆÄÀÏ ÆÐÄ¡ ¾²·¹µå ½ÃÀÛ! g_pPatchThread = new PatchThread(this->GetSafeHwnd(), std::string(LPCTSTR(Dlg.GetPathName()))); g_pPatchThread->Start(); m_bWorking = true; } LRESULT CNxFileSystemToolDlg::OnCompletePatch(WPARAM wParam, LPARAM lParam) { m_bWorking = false; SAFE_DELETE(g_pPatchThread); //AfxMessageBox(_T("ÆÐÄ¡ ¿Ï·á!!")); if ( g_pWorking ) { ::PostMessage(g_pWorking->GetSafeHwnd(),WM_DESTROY,0,0); SAFE_DELETE(g_pWorking); } g_FileSystem.ChangeDir(_T("/")); UpdateFileList(); return 0; } void CNxFileSystemToolDlg::OnCompare() { char szFileList[ 10000 ]; TCHAR szFilter[] = _T( "DragonNest Packing File (*.pak)|*.pak|All Files (*.*)|*.*||" ); CFileDialog FileDlg( TRUE, _T("pak"), _T("*.pak"), OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_ENABLESIZING , szFilter, this ); memset( szFileList, 0, 10000 ); FileDlg.GetOFN().lpstrFile = szFileList; FileDlg.GetOFN().nMaxFile = 10000; FileDlg.m_ofn.lpstrTitle = "Open Source File"; if( FileDlg.DoModal() != IDOK ) { return; } std::vector< std::string > vecSour, vecDest; POSITION Pos = FileDlg.GetStartPosition(); while( Pos ) { CString szFileName = FileDlg.GetNextPathName( Pos ); vecSour.push_back( szFileName.GetBuffer() ); } FileDlg.m_ofn.lpstrTitle = "Open Destination File"; if( FileDlg.DoModal() != IDOK ) { return; } Pos = FileDlg.GetStartPosition(); while( Pos ) { CString szFileName = FileDlg.GetNextPathName( Pos ); vecDest.push_back( szFileName.GetBuffer() ); } std::vector< SPackingFileInfo > vecSourFileInfo, vecDestFileInfo; int i, j; for( i = 0; i < ( int )vecSour.size(); i++ ) { CEtPackingFile FileSystem; if( !FileSystem.OpenFileSystem( vecSour[ i ].c_str(), true ) ) { continue; } int nFileCount = FileSystem.GetFileCount(); for( j = 0; j < nFileCount; j++ ) { SPackingFileInfo *pFileInfo = FileSystem.GetFileInfo( j ); if( pFileInfo->dwCompressSize == 0 ) { continue; } vecSourFileInfo.push_back( *pFileInfo ); } FileSystem.CloseFileSystem(); } for( i = 0; i < ( int )vecDest.size(); i++ ) { CEtPackingFile FileSystem; if( !FileSystem.OpenFileSystem( vecDest[ i ].c_str(), true ) ) { continue; } int nFileCount = FileSystem.GetFileCount(); for( j = 0; j < nFileCount; j++ ) { SPackingFileInfo *pFileInfo = FileSystem.GetFileInfo( j ); if( pFileInfo->dwCompressSize == 0 ) { continue; } vecDestFileInfo.push_back( *pFileInfo ); } FileSystem.CloseFileSystem(); } std::vector< char > vecCheckField; std::vector< SPackingFileInfo > vecSourExist, vecDestExist, vecDiff; vecCheckField.resize( vecDestFileInfo.size() ); memset( &vecCheckField[ 0 ], 0, vecCheckField.size() ); for( i = 0; i < ( int )vecSourFileInfo.size(); i++ ) { for( j = 0; j < ( int )vecDestFileInfo.size(); j++ ) { if( _stricmp( vecSourFileInfo[ i ].szFileName, vecDestFileInfo[ j ].szFileName ) == 0 ) { vecCheckField[ j ] = 1; if( vecSourFileInfo[ i ].dwChecksum != vecDestFileInfo[ j ].dwChecksum ) { vecDiff.push_back( vecSourFileInfo[ i ] ); } break; } } if( j == ( int )vecDestFileInfo.size() ) { vecSourExist.push_back( vecSourFileInfo[ i ] ); } } for( i = 0; i < ( int )vecCheckField.size(); i++ ) { if( vecCheckField[ i ] == 0 ) { vecDestExist.push_back( vecDestFileInfo[ i ] ); } } if( vecDestExist.size() + vecSourExist.size() + vecDiff.size() == 0 ) { MessageBox( "File Is Identical" ); return; } MessageBox( "File Is Different" ); return; }