Windowsコード集 上のページ

#0021 階層数に依存しないフォルダの生成

通常のCreateDirectory関数は、1度に1つのフォルダしか生成する事ができません。
しかしインストーラー等を作る場合、"C:\Program Files\Application\bin" といった感じに複数階層に続くフォルダを作りたい場合があるんじゃないでしょうか。
そういった場合に使える、フォルダ生成関数です。

//-----------------------------------------------------------------------------
// フォルダ生成
//-----------------------------------------------------------------------------
// BOOL CreateDirectoryEx(
//   LPSTR pathname             // 生成フォルダ名
// );
//-----------------------------------------------------------------------------
BOOL CreateDirectoryEx(LPSTR pathname)
{
    HANDLE ff = NULL;               // FindFirstFileのハンドル
    WIN32_FIND_DATA fdata;          // FindFirstFileの属性格納先
    SECURITY_ATTRIBUTES attr;       // CreateDirectoryのセキュリティ記述子
    CHAR wpathname[MAX_PATH] = "";  // 作業パス
    LONG n = 0,l = lstrlen(pathname);

    while(n < l){
        // 次のフォルダまでを格納
        while(n < l){
            if(pathname[n] == '\\'){
                if(n > 0){
                    if(wpathname[n - 1] != ':')break;
                }else{
                    break;
                }
            }
            wpathname[n] = pathname[n];
            n++;
        }
        wpathname[n] = '\0';

        // フォルダの有無チェックを行い、必要ならフォルダ生成
        if((ff = FindFirstFile(wpathname,&fdata)) == INVALID_HANDLE_VALUE){
            // 見つからないとき、フォルダ作成
            attr.nLength = sizeof(SECURITY_ATTRIBUTES);
            attr.lpSecurityDescriptor = NULL;
            attr.bInheritHandle = FALSE;
            if(!CreateDirectory(wpathname,&attr))return FALSE;
        }else{
            // 見つかった名前がフォルダ以外のとき、エラーを返す
            FindClose(ff);
            if((fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0){
                return FALSE;
            }
        }

        wpathname[n] = '\\';
        n++;
    }

    return TRUE;
}


上のページ