////////////////////////////////////////////////////////// //Written by darkpgmr (http://darkpgmr.tistory.com), 2013. µð·ºÅ丮(directory) °ü·Ã C++ Win32 ÇÔ¼ö »ç¿ë¹ý ÆÄÀÏ ¿­±â(Àбâ), ÆÄÀÏ ÀúÀå(¾²±â/»ý¼º), µð·ºÅ丮(Æú´õ) ¿­±â(Àбâ), ÇöÀç °æ·Î(path) º¯°æ µî ÆÄÀÏ ½Ã½ºÅÛ¿¡ Á¢±ÙÇϱâ À§ÇÑ win32 ÇÔ¼ö »ç¿ë¹ýµéÀ» Á¤¸®ÇØ ºÃ½À´Ï´Ù. win32 ¹öÀü ÇÔ¼öµéÀ» ¾Ë¾ÆµÎ¸é ±»ÀÌ mfc¸¦ »ç¿ëÇÏÁö ¾Ê¾Æµµ µÇ±â ¶§¹®¿¡ ¿©·¯¸ð·Î ÁÁ½À´Ï´Ù. 1. ÇöÀç °æ·Î(path) ¾Ë¾Æ³»±â ¹× º¯°æÇϱâ TCHAR sPath[MAX_PATH] = {0,}; ::GetCurrentDirectory(MAX_PATH, sPath); ::SetCurrentDirectory(_T("c:\\")); 2. ÆÄÀÏ Àбâ/¿­±â(file read/open) °æ·Î(path) ¾ò±â ÆÄÀÏ ¿­±â ´ëÈ­»óÀÚ »ç¿ë¹ýÀÔ´Ï´Ù. ¾Æ·¡ ¿¹Á¦¿¡¼­´Â avi ÆÄÀÏÀ» ¿­µµ·Ï ÇÊÅ͸¦ ¼³Á¤Çß½À´Ï´Ù. ÇÊÅÍ ¾øÀÌ ¸ðµç ÆÄÀÏÀ» º¸¿©ÁÖ·Á¸é lpstrFilter¿¡ NULLÀ» ÁÖ¸é µË´Ï´Ù. TCHAR szFilePath[MAX_PATH] = {0,}; OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.lpstrFile = szFilePath; ofn.nMaxFile = sizeof(szFilePath); ofn.lpstrFilter = _T("Avi Files(*.avi)\0*.avi\0All Files (*.*)\0*.*\0"); ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if(::GetOpenFileName(&ofn)==false) return; TCHAR *return_path = ofn.lpstrFile; 3. ÆÄÀÏ ÀúÀå(write/save/create) °æ·Î ¾ò±â ÆÄÀÏ ÀúÀå ´ëÈ­»óÀÚ »ç¿ë¹ýÀÔ´Ï´Ù. ¾Æ·¡ ¿¹¿Í °°ÀÌ ÇÊÅÍ(*.avi)¸¦ »ç¿ëÇÑ´Ù°í Çؼ­ ÀÚµ¿À¸·Î avi°¡ È®ÀåÀÚ·Î ºÙ´Â°Ç ¾Æ´Õ´Ï´Ù. »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ °æ·Î¸íÀ» º¸°í ÇÊ¿äÇÑ °æ¿ì ÇÁ·Î±×·¡¸Ó°¡ Á÷Á¢ È®ÀåÀÚ¸¦ Ãß°¡ÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù. ÇÊÅ͸¦ ÇØÁ¦ÇÏ·Á¸é lpstrFilter¿¡ NULLÀ» ÁÖ¸é µË´Ï´Ù. TCHAR szFile[260] = _T(""); OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = _T("Avi Files(*.avi)\0*.avi\0All Files (*.*)\0*.*\0"); ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_OVERWRITEPROMPT; if(::GetSaveFileName(&ofn)==false) return; TCHAR *return_path = ofn.lpstrFile; 4. Æú´õ ¿­±â(folder open) ÆÄÀÏÀÌ ¾Æ´Ñ Æú´õ(µð·ºÅ丮)¸¦ ¿­°íÀÚ ÇÒ ¶§´Â ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù. TCHAR cpath[MAX_PATH] = _T(""); LPITEMIDLIST pDirList; BROWSEINFO browseInfo; browseInfo.hwndOwner = NULL; browseInfo.pidlRoot = NULL; browseInfo.lpszTitle = _T("À̹ÌÁöµéÀ» ºÒ·¯¿Ã Æú´õ¸¦ ¼±ÅÃÇØ ÁÖ¼¼¿ä"); browseInfo.pszDisplayName = cpath; browseInfo.ulFlags = BIF_RETURNONLYFSDIRS; browseInfo.lpfn = NULL; browseInfo.lParam = 0; pDirList = SHBrowseForFolder(&browseInfo); if(pDirList == NULL) return; SHGetPathFromIDList(pDirList, cpath); TCHAR *return_path = cpath; 5. ÇöÀç °æ·Î¸¦ ·çÆ®(root)·Î Æú´õ ¼±ÅÃÇϱâ (Unicode encoding) ÇöÀç ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â Æú´õ/°æ·Î¸¦ ·çÆ®·Î Æú´õ ¿­±â ´ëÈ­»óÀÚ¸¦ »ý¼ºÇÕ´Ï´Ù (Unicode ÀÎÄÚµùÀ» »ç¿ëÇÒ °æ¿ì). // set current directory to be root directory TCHAR sPath[MAX_PATH] = {0}; ::GetCurrentDirectory(MAX_PATH, sPath); LPITEMIDLIST pStartDir; ULONG nCharsParsed = 0; LPSHELLFOLDER pShellFolder = NULL; SHGetDesktopFolder(&pShellFolder); HRESULT hr = pShellFolder->ParseDisplayName(NULL, NULL, sPath, &nCharsParsed, &pStartDir, NULL); pShellFolder->Release(); // Get directory from user TCHAR cpath[MAX_PATH]; LPITEMIDLIST pDirList; BROWSEINFO browseInfo; browseInfo.hwndOwner = NULL; // m_hWnd browseInfo.pidlRoot = pStartDir; browseInfo.lpszTitle = _T("À̹ÌÁöµéÀ»ºÒ·¯¿ÃÆú´õ¸¦¼±ÅÃÇØÁÖ¼¼¿ä"); browseInfo.pszDisplayName = cpath; browseInfo.ulFlags = BIF_RETURNONLYFSDIRS; browseInfo.lpfn = NULL; browseInfo.lParam = 0; pDirList = SHBrowseForFolder(&browseInfo); if(pDirList == NULL) return; SHGetPathFromIDList(pDirList, cpath); TCHAR *return_path = cpath; 6. ÇöÀç °æ·Î¸¦ ·çÆ®(root)·Î Æú´õ ¼±ÅÃÇϱâ (Multi-Byte or No encoding) ÇöÀç ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â Æú´õ/°æ·Î¸¦ ·çÆ®·Î Æú´õ ¿­±â ´ëÈ­»óÀÚ¸¦ »ý¼ºÇÕ´Ï´Ù (Multi-byte ÀÎÄÚµùÀ» »ç¿ëÇÒ °æ¿ì ¶Ç´Â ÀÎÄÚµùÀ» ¼³Á¤ÇÏÁö ¾Ê¾ÒÀ» °æ¿ì). // set current directory to be root directory TCHAR sPath[MAX_PATH] = {0}; ::GetCurrentDirectory(MAX_PATH, sPath); OLECHAR wszPath[MAX_PATH] = {0}; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (LPCSTR)sPath, -1, wszPath, MAX_PATH); LPITEMIDLIST pStartDir; ULONG nCharsParsed = 0; LPSHELLFOLDER pShellFolder = NULL; SHGetDesktopFolder(&pShellFolder); HRESULT hr = pShellFolder->ParseDisplayName(NULL, NULL, wszPath, &nCharsParsed, &pStartDir, NULL); pShellFolder->Release(); // Get directory from user TCHAR cpath[MAX_PATH]; LPITEMIDLIST pDirList; BROWSEINFO browseInfo; browseInfo.hwndOwner = NULL; // m_hWnd browseInfo.pidlRoot = pStartDir; browseInfo.lpszTitle = _T("À̹ÌÁöµéÀ»ºÒ·¯¿ÃÆú´õ¸¦¼±ÅÃÇØÁÖ¼¼¿ä"); browseInfo.pszDisplayName = cpath; browseInfo.ulFlags = BIF_RETURNONLYFSDIRS; browseInfo.lpfn = NULL; browseInfo.lParam = 0; pDirList = SHBrowseForFolder(&browseInfo); if(pDirList == NULL) return; SHGetPathFromIDList(pDirList, cpath); TCHAR *return_path = cpath; 7. ÇöÀç Æú´õ(µð·ºÅ丮)ÀÇ ÆÄÀÏ ¸ñ·Ï(¸®½ºÆ®) Á¢±ÙÇϱ⠾Ʒ¡ ¿¹´Â ÇöÀç °æ·ÎÀÇ Æú´õ¿¡ ÀÖ´Â ¸ðµç txt ÆÄÀÏÀÇ ÆÄÀÏÀ̸§À» Ãâ·ÂÇÏ´Â ¿¹ÀÔ´Ï´Ù. ¸ðµç ÆÄÀÏÀ» Á¢±ÙÇÏ°í ½ÍÀ¸¸é _findfirst(¡°*.*¡±,&c_file)¿Í °°ÀÌ ÇÏ¸é µË´Ï´Ù. struct _finddata_t c_file; intptr_t hFile = _findfirst("*.txt", &c_file); if(hFile==-1) return; // no files do { if(c_file.attrib & _A_SUBDIR) { // directory ó¸® } else if(c_file.attrib & _A_HIDDEN) { // hidden file ó¸® } else { // ÀÏ¹Ý ÆÄÀÏ Ã³¸® printf("%s\n", c_file.name); } } while(_findnext(hFile, &c_file)==0); _findclose(hFile); 8. °æ·Î ºÐÇØÇϱâ ÆÄÀÏ °æ·Î¸¦ µå¶óÀ̺ê, µð·ºÅ丮, ÆÄÀϸí, È®ÀåÀÚ·Î ºÐ¸®ÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. char fdrive[5]; char fdir[200]; char fname[100]; char fext[10]; _splitpath_s(path, fdrive, 5, fdir, 200, fname, 100, fext, 10); 9. ÇöÀç ³¯Â¥, ½Ã°£À» ÆÄÀÏ¸í¿¡ µ¡ºÙÀ̱⠹ݺ¹ÀûÀ¸·Î ÆÄÀÏÀ» ÀúÀåÇØ¾ß ÇÏ´Â °æ¿ì ÇöÀç ½Ã°£À» ÆÄÀÏ¸í¿¡ µ¡ºÙÀÌ¸é ³ªÁß¿¡ ÂüÁ¶ÇÒ ¶§ Æí¸®Çϱ⵵ ÇÏ°í ¶ÇÇÑ ±âÁ¸ ÆÄÀÏÀ» ½Ç¼ö·Î µ¤¾î¾²´Â °ÍÀ» ¹æÁöÇÒ ¼ö ÀÖ½À´Ï´Ù. char save_path[MAX_PATH]; SYSTEMTIME st; GetLocalTime(&st); sprintf_s(save_path, MAX_PATH, "filepath_%d.%d.%d_%d.%d.txt", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute); 10. »óÀ§ µð·ºÅ丮(Æú´õ)·Î À̵¿Çϱâ ÇöÀç °æ·ÎÀÇ parent directory·Î À̵¿Çϱâ À§ÇÑ ¹æ¹ýÀÔ´Ï´Ù. TCHAR path[MAX_PATH] = {0,}; ::GetCurrentDirectory(MAX_PATH, path); int i = _tcslen(path) - 1; while(i>=0 && path[i]!='\\') i--; if(i<=0) return; path[i] = 0; ::SetCurrentDirectory((LPCTSTR)path);