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;
}