My Study/C, C++

디렉토리 탐색 함수

디렉토리 탐색 함수와 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
);

출처 : PathAppend MSDN

pszPath 에 pszMore을 붙여 넣습니다. 만약 경로에 \ 가 안붙어 있으면 \를 붙여서 파일 경로를 완성합니다.


LPTSTR PathCombine(
  _Out_    LPTSTR  pszPathOut,
  _In_opt_ LPCTSTR pszPathIn,
  _In_     LPCTSTR pszMore
);

출처 : PathCombine MSDN

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;

출처 : WIN32_FIND_DATA MSDN

데이터에 대한 정보를 담고있는 구조체입니다.


HANDLE WINAPI FindFirstFile(
  _In_  LPCTSTR           lpFileName,
  _Out_ LPWIN32_FIND_DATA lpFindFileData
);

출처 : FindFirstFile MSDN

lpFileName 에 있는 정보를 lpFindFileData 에 넣고 핸들값을 반환합니다. FindNextFile 을 사용하기 위해서 먼저 사용합니다.


BOOL WINAPI FindNextFile(
  _In_  HANDLE            hFindFile,
  _Out_ LPWIN32_FIND_DATA lpFindFileData
);

출처 : FindNextFile MSDN

hFindFile 에 있는 정보를 wfd에 넣습니다.



'My Study > C, C++' 카테고리의 다른 글

WMI C++  (0) 2016.06.23
윈도우 콘솔 프로그램 숨기기(??)  (0) 2016.06.22
디렉토리 탐색 함수  (0) 2016.06.22
단순 연결 리스트(Linked List)  (0) 2015.02.25

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.