CLOSE
PowerBuilder Tips

方法

PowerBuilder (PowerServer) アプリケーションから多階層のフォルダーを一括で作成したい場合、Windows API の SHCreateDirectoryExW 関数を使用するのが便利です。
SHCreateDirectoryExW 関数を使用する最大のメリットは、「指定したパスの途中にある中間フォルダーが存在しない場合でも、再帰的にすべて一括で作成してくれる」点にあります (例 : \\server\share しか存在しない状態で、\\server\share\proj\logs を一度に作成可能)。

本記事では、この Windows API を利用してネットワークフォルダーを作成する手順を解説します。
※ ネットワーク共有のルート (例 : \\server\share) 部分は事前に存在している必要があります。
※ 32-bit / 64-bit アプリケーションどちらでも実行可能です。

1. 外部関数の宣言

はじめに、SHCreateDirectoryExW 関数を、[Local External Functions] または [Global External Functions] に外部関数として定義します。
※ 64-bit 環境でも安全に動作させるため、ハンドル (hwnd) やポインタ (lpSecurityAttributes) の引数には longptr 型を使用します。
※ longptr は PowerBuilder 12.6 以降で利用可能です。旧バージョンの場合は ulong (または long) に置き換えてください。

【Global External Functions】

// ==============================================================================
// 外部関数宣言 : SHCreateDirectoryExW Unicode 版 (shell32.dll)
// 【概要】Windows 環境で複数階層のフォルダーを一度に作成する
// 【引数】
//   - hwnd                 : エラーメッセージなどの UI ダイアログを表示する場合の「親ウィンドウ」を指定 (エラー画面用)。基本 NULL で OK。
//   - pszPath              : 新しく作りたいフォルダーのフルパスを指定。
//   - lpSecurityAttributes : フォルダーに特別なアクセス権限を設定するための構造体へのポインター。基本 NULL で OK。
// 【戻り値】
//   - 成功時は 0、失敗時は 0 以外
// ==============================================================================

Function long SHCreateDirectoryExW (longptr hwnd, string pszPath, longptr lpSecurityAttributes) Library "shell32.dll"

2. スクリプトの実装 (Clicked イベント)

今回はウィンドウに配置されたボタンを押した際に、ネットワーク上にフォルダーを作成するよう、ボタンの Clicked イベントから SHCreateDirectoryExW 関数を呼び出します。

【ボタンの clicked イベント】

string lsPath
long llRC

// 作成場所を取得
lsPath = sle_folder.text

// セキュリティ属性は null (0) 設定
llRC = SHCreateDirectoryExW(0, lsPath, 0)

// 戻り値の扱い
CHOOSE CASE llRC

	CASE 0 // ERROR_SUCCESS 「すべて作成」

            MessageBox("OK", "フォルダーを作成しました。")
    
	CASE 183 // ERROR_ALREADY_EXISTS
                 // 既に存在 ⇒ 成功扱いでよいケースも多い
                 // (パス上のどこかが存在でも返ることがあります) 
                 // 何もしない / 情報表示のみにする
   
	CASE ELSE// 代表的なエラー : 5 = アクセス拒否, 53 = ネットワークパスなし

            MessageBox("エラー", "SHCreateDirectoryExW 失敗。コード=" + String(llRC))

END CHOOSE

3. 実行結果

アプリケーションを実行後、作成したいフォルダーを指定し、作成ボタンを押します。

フォルダー作成画面

今回の例では、ネットワーク上の share フォルダー以下の階層に、自動的に「proj」フォルダーとその直下の「logs」フォルダーが一括で作成されるのが確認できます。

フォルダー作成前
フォルダー作成後

関連情報

PowerBuilder アプリケーションから Windows API を呼び出す際の概要を理解したい方は、こちらの記事がおすすめです!


Windows API の活用方法はこちら!

 

Tips情報

プロダクト :PowerBuilder

バージョン :2022R3

x instagram facebook youtube