디렉토리 탐색 함수
디렉토리 탐색 함수와 wcscpy_s, wcscat_s 로 해당 경로 상위 디렉토리 탐색하는 것을 하나하나 다 만들었는데 win32 api를 이용해서 제가 생각하는 최소의 코드 길이로 제작해 보았습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | void DirectorySearch(wchar_t *path) { setlocale(LC_ALL, ""); //w_char* 한글 출력 WIN32_FIND_DATAW wfd = { 0, }; HANDLE hSrch = NULL; BOOL bResult = TRUE; wchar_t setPath[_MAX_PATH] = { 0, }; wchar_t tmp[_MAX_PATH] = { 0, }; PathAppendW(setPath, path); PathAppendW(setPath, L"*.*"); hSrch = FindFirstFile(setPath, &wfd); if (hSrch == INVALID_HANDLE_VALUE) return; while (bResult) { if (wfd.cFileName[0] == L'.') { bResult = FindNextFileW(hSrch, &wfd); continue; } PathCombine(tmp, path, wfd.cFileName); if (is_dir(tmp)) //디렉토리 확인 함수 DirectorySearch(tmp); printf("%ws\n", wfd.cFileName); bResult = FindNextFileW(hSrch, &wfd); } FindClose(hSrch); } | cs |
코드 지적해주시면 감사하겠습니다.
사용된 API
BOOL PathAppend( _Inout_ LPTSTR pszPath, _In_ LPCTSTR pszMore );
pszPath 에 pszMore을 붙여 넣습니다. 만약 경로에 \ 가 안붙어 있으면 \를 붙여서 파일 경로를 완성합니다.
LPTSTR PathCombine( _Out_ LPTSTR pszPathOut, _In_opt_ LPCTSTR pszPathIn, _In_ LPCTSTR pszMore );
pszPathOut에 pszPathIn과 pszMore 을 합쳐서 넣습니다. pszPathIn 과 pszMore 경로 사이에 \ 가 없으면 붙이고 pszPathOut에 넣습니다.
typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[MAX_PATH]; TCHAR cAlternateFileName[14]; } WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;
데이터에 대한 정보를 담고있는 구조체입니다.
HANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName, _Out_ LPWIN32_FIND_DATA lpFindFileData );
lpFileName 에 있는 정보를 lpFindFileData 에 넣고 핸들값을 반환합니다. FindNextFile 을 사용하기 위해서 먼저 사용합니다.
BOOL WINAPI FindNextFile( _In_ HANDLE hFindFile, _Out_ LPWIN32_FIND_DATA lpFindFileData );
hFindFile 에 있는 정보를 wfd에 넣습니다.
'My Study > C, C++' 카테고리의 다른 글
WMI C++ (0) | 2016.06.23 |
---|---|
윈도우 콘솔 프로그램 숨기기(??) (0) | 2016.06.22 |
단순 연결 리스트(Linked List) (0) | 2015.02.25 |