〜 ファイル 〜
ファイルをゴミ箱へ移動 (要SHELL32.DLL)

delete命令を使用するとファイルを削除できますが、ゴミ箱には移動されず直接削除されます。
復活させることもできるようにファイルをゴミ箱に移動するにはAPI関数SHFileOperationを使いましょう。
SHFileOperationは今回行う削除以外にもコピーまたは移動するときにも使用するものなので、
今回はSHFileOperationに渡すパラメータSHFILEOPSTRUCT構造体(のアドレス)のうち、
ファイル操作を示すwfuncメンバ(HSPの配列要素1番目)に削除処理を示す「FO_DELETE(=0x0003)」を、
そして、対象のファイルパスを格納した変数ポインタをlpFromメンバ(HSPの配列要素2番目)にセット、
オプションフラグを示すfFlagsメンバ(HSPの配列要素4番目)に以下の合計値を指定します。
経過を示すプログレスバー付ウィンドウを表示しない「FOF_SILENT(=0x0004)」
表示ウィンドウで「はい」または「すべて」を示す「FOF_NOCONFIRMATION(=0x0010)」
アンドゥできるように(=削除ではゴミ箱に移動)する「FOF_ALLOWUNDO(=0x0040)」
経過を示すプログレスバー付ウィンドウにファイル名を表示しない「FOF_SIMPLEPROGRESS(=0x0100)」
エラー発生時にUIを表示しない「FOF_NOERRORUI(=0x0400)」
ゴミ箱へ入れずに削除する際に警告する「FOF_WANTNUKEWARNING(=0x4000)」
他にも幾つかフラグは存在しますが、wfuncメンバが「FO_MOVE(=0x0001)」や「FO_COPY(=0x0002)」、
「FO_RENAME(=0x0004)」時に使用されるものなのでここでは紹介しません。
「経過ウィンドウを表示する」設定、かつ「ウィンドウにファイル名を表示しない」場合には、
SHFILEOPSTRUCT構造体のlpTitleメンバ(HSPの配列要素7番目)に表示文字列ポインタを指定できます。
尚、ファイルは複数指定(同時に削除)することが可能で、ファイル毎の区切りはNULL
一番最後のファイルパスの後にはNULLを2つ付ける様にと説明されていますので、
当サンプルモジュールは、1行を1ファイルパスのメモリノートパッド形式で指定すれば、
内部で上記のNULLコード区切りに変換するような処理を入れています。
	

filedel 対象ファイル, オプション
対象ファイルゴミ箱へ移動させる対象ファイルパスを指定する。
尚、複数指定する場合はメモリノートパッド(1行1パス)形式で指定すること。
オプション下記の合計値を指定する。
「0x0004」プログレスウィンドウを表示しない。
「0x0010」はい、またはすべてはいを示す。
「0x0040」アンドゥできるようゴミ箱へ移す(今回必須のオプション)。
「0x0100」プログレスウィンドウにファイル名を表示しない。
「0x0400」プエラー発生時にUIを表示しない。
「0x4000」ゴミ箱へ移さずに削除する場合は警告する(今回不要のオプション)。

 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
	ll_libload shell, "shell32.dll"
	ll_getproc SHFileOperation, "SHFileOperationA", shell

#module
#deffunc filedel val, int
	mref files, 24 : mref prg, 1
	mref stt, 64
	strlen i, files
	sdim f, i + 2
	dim pFileOp, 8
	i.2 = 0
	repeat
		// ファイルパス取り出し
		strlen i, files
		instr i.1, files, "\n"
		if i.1 = -1 : i.1 = i : if i = 0 : break
		strmid s, files, 0, i.1
		strmid files, files, i.1 + 2, i - i.1 - 2
		// NULL区切りに変更
		strlen i, s
		repeat i
			peek i, s, cnt
			poke f, i.2, i
			i.2++
		loop
		i.2++
	loop
	ll_getptr f : ll_ret prm.2
	i = 0, 0x0003, prm.2, 0, (prg ! 0) * 0x0004 + 0x0450 // FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI
	ll_getptr i : ll_ret prm
	ll_callfunc prm, 1, SHFileOperation@
	ll_ret i : stt = i
	return
#global

	sdim path, 2000
	notesel path
	pos 10, 10 : button "追加", *add
	pos 10, 40 : button "削除", *del
	pos 10, 70 : button "実行", *rmv
	objsize 320, 30
	pos 80, 10 : listbox index, 400, path
	stop

*add
	dialog "", 16
	if stat {
		noteadd refstr, -1
		objprm 3, path
	}
	stop

*del
	if index ! -1 {
		notedel index
		objprm 3, path
	}
	stop

*rmv
	filedel path, 1
	if stat : dialog "削除に失敗しました"
	path = ""
	objprm 3, path
	stop

filedel 対象ファイル, オプション
対象ファイルゴミ箱へ移動させる対象ファイルパスを指定する。
尚、複数指定する場合はメモリノートパッド(1行1パス)形式で指定すること。
オプション下記の合計値を指定する。
「0x0004」プログレスウィンドウを表示しない。
「0x0010」はい、またはすべてはいを示す。
「0x0040」アンドゥできるようゴミ箱へ移す(今回必須のオプション)。
「0x0100」プログレスウィンドウにファイル名を表示しない。
「0x0400」プエラー発生時にUIを表示しない。
「0x4000」ゴミ箱へ移さずに削除する場合は警告する(今回不要のオプション)。

 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
38
39
40
41
42
43
44
45
46
47
48
49
50
#uselib "shell32.dll"
#cfunc global SHFileOperation "SHFileOperationA" var

#module
#defcfunc filedel var files, int prg, local f, local s, local i, local pFileOp
	sdim f, strlen(files) + 2
	dim pFileOp, 8
	notesel files
	repeat notemax
		noteget s, cnt
		repeat strlen(s)
			poke f, i, peek(s, cnt)
			i++
		loop
		i++
	loop
	noteunsel
	pFileOp = 0, 0x0003, varptr(f), 0, (prg ! 0) * 0x0004 + 0x0450 // FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI
	return SHFileOperation(pFileOp)
#global

	sdim path, 2000
	notesel path
	pos 10, 10 : button gosub "追加", *add
	pos 10, 40 : button gosub "削除", *del
	pos 10, 70 : button gosub "実行", *rmv
	objsize 320, 30
	pos 80, 10 : listbox index, 400, path
	stop

*add
	dialog "", 16
	if stat {
		noteadd refstr, -1
		objprm 3, path
	}
	return

*del
	if index ! -1 {
		notedel index
		objprm 3, path
	}
	return

*rmv
	if filedel(path, 1) : dialog "削除に失敗しました"
	path = ""
	objprm 3, path
	return