손쉽게 File을 나열할 수 있는 class 공유(FindFirstFile/FindNextFile Wrapper)
2012. 3. 23. 13:06 in 프로그래밍/Let's Share it

파일 나열을 위해 FindFirstFile / FindNextFile을 사용하는데,
보통 SubDirectory를 지원하기 위해선 재귀호출을 사용해야 합니다.
그러다보면 자연히 코드가 좀더 너저분해 지는 경향이 있습니다.
그리고, Path의 Component(즉, \...\ 사이에 있는 길이)가 MAX_PATH를 넘어가면 발생하는 문제 해결을 위해,
Naming a file(\\?\를 붙이기)이 필요합니다. 해당 부분도 역시 지원합니다.
다음 code(class)만 추가하면 됩니다.
- #pragma once
- #include "FileTraverse.h"
- class CFileEnumProcess : public CFileTraverse
- {
- public:
- CFileEnumProcess(void);
- ~CFileEnumProcess(void);
- public:
- virtual BOOL OnTraverse(IN LPCTSTR lpszFullPath, IN LPCTSTR lpszNamedPath, IN PWIN32_FIND_DATA pstFD);
- };
- #include "StdAfx.h"
- #include "FileEnumProcess.h"
- CFileEnumProcess::CFileEnumProcess(void)
- {
- }
- CFileEnumProcess::~CFileEnumProcess(void)
- {
- }
- BOOL CFileEnumProcess::OnTraverse(IN LPCTSTR lpszFullPath, IN LPCTSTR lpszNamedPath, IN PWIN32_FIND_DATA pstFD)
- {
- BOOL bContinue = TRUE;
- _tprintf(TEXT("[0x%x] %s\r\n"), pstFD->dwFileAttributes, lpszFullPath);
- return bContinue;
- }
즉, CFileTraverse를 상속하고,
virtual BOOL OnTraverse(IN LPCTSTR lpszFullPath, IN LPCTSTR lpszNamedPath, IN PWIN32_FIND_DATA pstFD);
만 재정의 하시면 됩니다.
Enum을 중단하려면 FALSE를 리턴하면 됩니다.
위와 같이 class를 정의하고,
- #include "stdafx.h"
- #include "FileEnumProcess.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
- CFileEnumProcess cFileEnum;
- cFileEnum.Traverse(TEXT("C:\\"), TRUE);
- }
와 같이 호출하면, C:\ 하부에 있는 파일을 아래와 같이 나열(_tprintf)합니다.
... [0x20] C:\eclipse\configuration\org.eclipse.osgi\bundles\321\1\.cp\icons\full\dl cl16\localtypes_co.gif [0x20] C:\eclipse\configuration\org.eclipse.osgi\bundles\321\1\.cp\icons\full\dl cl16\public_co.gif [0x20] C:\eclipse\configuration\org.eclipse.osgi\bundles\321\1\.cp\icons\full\dl cl16\static_co.gif [0x10] C:\eclipse\configuration\org.eclipse.osgi\bundles\321\1\.cp\icons\full\dt ool16 [0x20] C:\eclipse\configuration\org.eclipse.osgi\bundles\321\1\.cp\icons\full\dt ool16\mark_occurrences.gif ... |
'프로그래밍 > Let's Share it' 카테고리의 다른 글
PE 포맷 바이너리 파일의 버전을 구하는 함수 (0) | 2012.04.30 |
---|---|
프로세스 생성 종결자 (ShellExecute / CreateProcess) (0) | 2012.03.23 |
VC9.0에서 crypto++ library를 이용하여 SHA256(sha2) 구하기 (8) | 2011.12.14 |
비동기(OVERLAPPED I/O, IOCP, Thread Pool) IPC PIPE Class 공유 (0) | 2011.12.14 |
[ATL/MFC/C++] Ini Parser(ini 파서) (0) | 2011.11.30 |