〜 ファイル 〜
フォルダを削除2 (要SHELL32.DLL)

コチラにフォルダパスを指定するだけでフォルダ削除ができるAPI関数RemoveDirectoryを紹介しました。
設定が単純で使いやすいですが、中にファイルが存在するとフォルダ削除ができないと言う問題があります。
フォルダ内にファイルがあっても削除できるものはAPI関数SHFileOperationになりますが、
コピーや移動も行えるこの関数は、SHFILEOPSTRUCT構造体(のアドレス)をパラメータに渡すというもので、
API関数RemoveDirectoryよりかは若干手続きが面倒です。
今回のサンプルモジュールは、削除対象を1つだけに限定し、また、中身のあるなしに関わらず、
対象は任意のフォルダだけ(存在しないパスまたはファイルである場合は処理しない)としていますが、
このAPIは複数のファイルでも一括操作できるようになっており、
オプション指定すれば、確認メッセージの表示や、処理時のプログレスウィンドウ非表示にもできます。
詳しい設定については、コチラで紹介している「ゴミ箱に移す」処理を参考にしてください。
	

dirdel 対象フォルダ
対象フォルダ削除対象のフォルダパスを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
	ll_libload shell, "shell32.dll"
	ll_getproc SHFileOperation, "SHFileOperationA", shell

#module
#deffunc dirdel str
	mref folder, 32
	mref stt, 64
	dirlist s, folder, 5
	if stat = 0 : stt = -1 : return
	dim pFileOp, 8
	ll_getptr folder : ll_ret prm.2
	i = 0, 0x0003, prm.2
	ll_getptr i : ll_ret prm
	ll_callfunc prm, 1, SHFileOperation@
	ll_ret i : stt = i
	return
#global

	data = "hspbc_tips_test"
	dirlist check, curdir + "\\" + data, 5
	if stat = 0 {
		dialog "テストフォルダ及びファイルを新しく作成しますか?", 2, data
		if stat = 7 : end
		mkdir data
		mes "テストフォルダ作成完了"
	}
	bsave curdir + "\\" + data + "\\" + data + "1.txt", data
	bsave curdir + "\\" + data + "\\" + data + "2.dat", data
	bsave curdir + "\\" + data + "\\" + data + "3.test", data
	mes "テストファイル作成完了"
	dirdel curdir + "\\" + data 
	if stat ! 0 {
		mes "削除に失敗しました"
	} else {
		mes "削除に成功、またはキャンセルされました"
	}
	stop

dirdel 対象フォルダ
対象フォルダ削除対象のフォルダパスを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#uselib "shell32.dll"
#cfunc global SHFileOperation "SHFileOperationA" var

#module
#defcfunc dirdel str folder, local s, local pFileOp
	dirlist s, folder, 5
	if stat = 0 : return -1
	s = folder
	dim pFileOp, 8
	pFileOp = 0, 0x0003, varptr(s)
	return SHFileOperation(pFileOp)
#global

	data = "hspbc_tips_test"
	dirlist check, dir_cur + "\\" + data, 5
	if stat = 0 {
		dialog "テストフォルダ及びファイルを新しく作成しますか?", 2, data
		if stat = 7 : end
		mkdir data
		mes "テストフォルダ作成完了"
	}
	bsave dir_cur + "\\" + data + "\\" + data + "1.txt", data
	bsave dir_cur + "\\" + data + "\\" + data + "2.dat", data
	bsave dir_cur + "\\" + data + "\\" + data + "3.test", data
	mes "テストファイル作成完了"
	if dirdel(dir_cur + "\\" + data) ! 0 {
		mes "削除に失敗しました"
	} else {
		mes "削除に成功、またはキャンセルされました"
	}