一度に多階層のディレクトリを作成する

ディレクトリ作成にはCreateDirectory()_mkdir()を使って作成しますが
これらの関数は1つのディレクトリしか作成する事が出来ません。
多階層のディレクトリを作成するには親ディレクトリから1つずつ作成していきます。
しかしこれでは面倒なので新しく関数を作成しちゃいましょう。


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

  関数名:BOOL MakeDirectory(LPCTSTR lpPathName)
  引 数:lpPathName 作成するディレクトリのパス名が入ったNULLで終わる文字列。
 戻り値:関数が成功すると、0以外の値が返り、関数が失敗すると、0が返ります。
  解 説:多階層のディレクトリを一度に作成。

/-------------------------------------------------------------------------------*/
BOOL MakeDirectory(LPCTSTR lpPathName)
{
    int nStart = 0;
    BOOL res = FALSE;
    CString strMakePath;
    CString strPathName = lpPathName;
    strPathName.TrimRight('\\');
    strPathName += _T("\\");

    // ディレクトリを1つずつ繰り返し作成
    while(strMakePath + _T("\\") != strPathName)
    {
        // 作成するディレクトリ名を設定
        nStart = strPathName.Find('\\', nStart + 1);
        strMakePath = strPathName.Left(nStart);

        // ディレクトリが存在するかチェックし無ければ作成
        CFileStatus rStatus;
        if(!(CFile::GetStatus(strMakePath, rStatus) ||
           (strMakePath.GetLength() == 2 && strMakePath.GetAt(1) == ':')))
            res = ::CreateDirectory(strMakePath, NULL);
    }
    return res;
}

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


// ディレクトリ"C:\abc\DEF\あいう"を作成
if(MakeDirectory(_T("C:\\abc\\DEF\\あいう")))
    AfxMessageBox(_T("作成完了"));
else
    AfxMessageBox(_T("作成失敗"));

2001/3/5 追記
MakeSureDirectoryPathExists()というAPIで一発で作成できたりもする。(^^;

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