RemoveDirectory()라는 함수가 있는데, 요놈은 빈디렉토리만 지운다. 비어있지 않으면, 비어있지 않다고(GetLastError) 에러메시지를 뿌려준다.
그러면 파일이나 폴더를 계속 찾아가면서 지워야 한다는 뜻이다. DeleteFile과 RemoveDirectory를 섞어가면서...
원본글 주소 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=6254&ref=6254
void DeleteFolder(LPTSTR lpFolder)
{
WIN32_FIND_DATA FindData;
HANDLE FindHandle;
char temp1[MAX_PATH];
int lpFolder_Len;
if(lpFolder==NULL)
{
return;
}
if(*lpFolder=='\0')
{
return;
}
lpFolder_Len=strlen(lpFolder);
if(lpFolder[lpFolder_Len-1]=='\\')
{
sprintf(temp1, "%s*.*", lpFolder);
}
else
{
sprintf(temp1, "%s\\*.*", lpFolder);
}
FindHandle=FindFirstFile(temp1, &FindData);
if(INVALID_HANDLE_VALUE!=FindHandle)
{
while(1)
{
if(lpFolder[lpFolder_Len-1]=='\\')
{
sprintf(temp1, "%s%s", lpFolder, FindData.cFileName);
}
else
{
sprintf(temp1, "%s\\%s", lpFolder, FindData.cFileName);
}
if(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//Dir
if(strcmp(FindData.cFileName, ".")==0)
{
//. -->> skip
}
else if(strcmp(FindData.cFileName, "..")==0)
{
//.. -->> skip
}
else
{
DeleteFolder(temp1);
if((FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)||
(FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
{
SetFileAttributes(temp1, FILE_ATTRIBUTE_NORMAL);
}
RemoveDirectory(temp1);
}
}
else
{
//File
if((FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)||
(FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
{
SetFileAttributes(temp1, FILE_ATTRIBUTE_NORMAL);
}
DeleteFile(temp1);
}
if(!FindNextFile(FindHandle, &FindData))
{
break;
}
}
}
FindClose(FindHandle);
SetFileAttributes(lpFolder, FILE_ATTRIBUTE_NORMAL);
RemoveDirectory(lpFolder);
}
또는 쉘을 이용해서...
BOOL SHDeleteFonder(char *pFolder)
{
SHFILEOPSTRUCT FileOp = {0};
char szTemp[MAX_PATH];
strcpy(szTemp, pFolder);
szTemp[strlen(pFolder) + 1] = NULL;
FileOp.hwnd = NULL;
FileOp.wFunc = FO_DELETE; // 삭제 속성 설정
FileOp.pTo = NULL;
FileOp.fFlags = FOF_SILENT | FOF_NOCONFIRMATION;//FOF_NOCONFIRMATION | FOF_NOERRORUI; // 확인메시지가 안뜨도록 설정
FileOp.fAnyOperationsAborted = false;
FileOp.hNameMappings = NULL;
FileOp.lpszProgressTitle = szTemp;
FileOp.pFrom = szTemp;
if(SHFileOperation(&FileOp)==0) // 삭제 작업
{
return TRUE;
}
return FALSE;
}
그런데 왜 난...쉘을 이용해서 지우기 할 때....핸들값에 NULL을 넣으면 안될까나-_-;;
댓글 없음:
댓글 쓰기