深いディレクトリの削除を再帰的に行う。(ReadOnlyの場合も対応)

(2001.01.01)
BOOL RecurseRemoveDirectory(LPCTSTR lpPathName, BOOL bReadOnly = TRUE)
{
    ASSERT(lpPathName);
   
// TRACE("%s\n", lpPathName);
    TCHAR szPathName[_MAX_PATH];
    _tcscpy(szPathName, lpPathName);
    _tcscat(szPathName, _T("\\*.*"));
   
    WIN32_FIND_DATA wfd;
    HANDLE Handle = ::FindFirstFile(szPathName, &wfd);
    if(Handle == INVALID_HANDLE_VALUE)
    {
        return FALSE;
    }
   
    do
    {
        if (_tcscmp(wfd.cFileName, _T(".")) != 0 && _tcscmp(wfd.cFileName, _T("..")) != 0)
        {
            TCHAR szFileName[_MAX_PATH];
            _tcscpy(szFileName, lpPathName);
            _tcscat(szFileName, _T("\\") );
            _tcscat(szFileName, wfd.cFileName);
           
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                // 自分自身を呼び出す
                ::RecurseRemoveDirectory(szFileName, bReadOnly);
            }
            else
            {
                // ReadOnly 属性を、外す
                if (bReadOnly == TRUE)
                {
                    DWORD dwFileAttributes;
                    dwFileAttributes = GetFileAttributes(szFileName);
                    dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
                    ::SetFileAttributes(szFileName, dwFileAttributes);
                }
               
                // ファイルの削除
//            TRACE(" %s\n", szFileName);
                ::DeleteFile(szFileName);
            }
        }
    }
    while (::FindNextFile(Handle, &wfd));
   
    ::FindClose(Handle);
   
    // ReadOnly 属性を、外す
    if (bReadOnly == TRUE)
    {
        DWORD dwFileAttributes;
        dwFileAttributes = GetFileAttributes(lpPathName);
        dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
        ::SetFileAttributes(lpPathName, dwFileAttributes);
    }
   
    // ディレクトリの削除
    BOOL bResult = ::RemoveDirectory(lpPathName);
   
    return bResult;
}
一覧に戻る
© 2003 WAC.com All Right Reserved.