2014년 10월 27일 월요일

폴더 삭제(폴더 안에 파일이나 폴더가 있을 경우)

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을 넣으면 안될까나-_-;;

댓글 없음: