리스트 안의 특정 파일만 삭제하고, 또 어떤 폴더의 경우 개별적인 파일이 아니라 폴더 전체를 지워야 했다.

구글링을 통해 Copy & Paste로 해결. 언제까지 C&P만 하는 수준일지...

bool DeleteDirectory(LPCSTR lpszDir, bool noRecycleBin = true)
{
	int len = _tcslen(lpszDir);
	TCHAR *pszFrom = new TCHAR[len+2];
	_tcscpy(pszFrom, lpszDir);
	pszFrom[len] = 0;       // double-null termination
	pszFrom[len+1] = 0;   // double-null termination
	
	SHFILEOPSTRUCT	FileOp;
	
	FileOp.hwnd = NULL;
	FileOp.wFunc = FO_DELETE;
	FileOp.pFrom = pszFrom;
	FileOp.pTo = NULL;
	FileOp.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
	
	if( !noRecycleBin )
		FileOp.fFlags |= FOF_ALLOWUNDO;
		
	FileOp.fAnyOperationsAborted = FALSE;
	FileOp.lpszProgressTitle = NULL;
	FileOp.hNameMappings = NULL;
	
	int ret = SHFileOperation(&FileOp);
	delete [] pszFrom;
	return (ret == 0);

}



typedef struct _SHFILEOPSTRUCT {
    HWND hwnd;
    UINT wFunc;
    LPCTSTR pFrom;
    LPCTSTR pTo;
    FILEOP_FLAGS fFlags;
    BOOL fAnyOperationsAborted;
    LPVOID hNameMappings;
    LPCTSTR lpszProgressTitle;
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;


SHFILEOPSTRUCT 에 대하여 알아보자. 물론 MSDN에 있다. ㅡ.ㅡ

파일 처리 작업을 하는데 필요한 정보를 포함하고 있는 구조체로, Vista의 경우 IFileOperation 을 사용하는 것을 추천한다고 한다.

헉, Vista에 대한 처리는 안했는데,, 내일 가서 해야겠다.

hwnd 는 다이얼로그 박스에 대한 Handle,
wFunc 는 어떠한 작업을 수행할 것인지 가리키는 것으로, FO_COPY, FO_DELETE, FO_MOVE, FO_RENAME,,
pFrom, pTo 는 source directory이나 file, destination directory나 file을 가리키는 포인터이다.
아울러 문자열은 항상 double-null로 종결되어야 한다. 마지막에 널 값이 두개가 되도록 해야된다는...
fFlags는 파일 작업을 할때, 제어하기 위한 플래그로 사용된다.
fAnyOperationAbroted 는 파일 함수가 끝나기 전에 취소될 경우 항상 TRUE를 반환한다. 그렇지 않을 경우는 FALSE를 return,
fNameMappings 는 fFlags 가 FOF_WANTMAPPINGHANDLE 로 설정된 경우,
이전 파일 이름과, 새파일 이름의 name mapping object의 Handle을 가지고 있다.
lpszProgressTitle 은 파일 작업 처리 진행과정에 보여지는 다이얼로그에 보여질 제목이다. 이건 문자열 끝에 널이 하나만 있어도 된다.

헤더는 shellapi.h를 include 시키면 된다.

자세한 건 MSDN에서,,,

내일가서 할일이 또 하나 생겼군....
저작자 표시
신고
블로그 이미지

Moonistar moonistar