ディレクトリを一括削除する

ディレクトリの削除はRemoveDirectory()_rmdir()で出来ますが
ディレクトリ内が空じゃないと削除する事が出来ません。
そこでディレクトリ内のファイルを削除してからディレクトリを削除するという
ステップが必要ですが面倒なので関数を作成してしまいましょう。

やっている事は簡単で、ディレクトリ内のファイルを全て検索して削除し
サブフォルダが有った場合はサブフォルダを再帰呼び出しで削除して
全てのファイルを削除後ディレクトリを削除します。


/*-------------------------------------------------------------------------------/

  関数名:BOOL DeleteDirectory(LPCTSTR lpPathName)
  引 数:lpPathName 削除するディレクトリのパス名が入ったNULLで終わる文字列。
 戻り値:関数が成功すると、0以外の値が返り、関数が失敗すると、0が返ります。
  解 説:ディレクトリを丸ごと削除する。

/-------------------------------------------------------------------------------*/
BOOL DeleteDirectory(LPCTSTR lpPathName)
{
    CFileFind fnd;
    CString strPathName = lpPathName;
    strPathName.TrimRight('\\');
    strPathName += _T("\\*.*");
    if(fnd.FindFile(strPathName, 0))
    {
        int i = 1;
        while(i)
        {
            i = fnd.FindNextFile();

            // ファイル名が"."か".."の場合は次を検索
            if(fnd.IsDots())
                continue;

            // 削除するファイル名取得
            // GetFilePath()にはバグがあり正確に取得できない場合があるので使わない
            CString strDeleteFile = lpPathName;
            strDeleteFile.TrimRight('\\');
            strDeleteFile += _T("\\") + fnd.GetFileName();

            // フォルダだった場合、再帰呼び出しでそのフォルダを削除
            if(fnd.IsDirectory())
                DeleteDirectory(strDeleteFile);

            // ファイルの削除
            else
                ::DeleteFile(strDeleteFile);
        }
        fnd.Close();

        // フォルダの削除
        return ::RemoveDirectory(lpPathName);
    }
    return FALSE;
}

以下に使用例を示します。


// "C:\temp"以下を丸ごと削除
if(DeleteDirectory(_T("C:\\temp")))
    AfxMessageBox(_T("削除完了"));
else
    AfxMessageBox(_T("削除失敗"));

< 戻る << HOME ©1999-2001 by Akky, All right reserved.