〜 ファイル 〜
ファイルを移動・ファイル名を置換 (要KERNEL32.DLL)

同一ボリュームにおいて、ファイルやフォルダ移動は、ファイルパスの一部を変更しているに過ぎないので、
実質、移動とファイル名の変更処理は同じ処理となります。
ファイルの移動もリネームを行っているだけという今回使用するAPI関数MoveFileExは、
リネームだけ行うという性質上、異なるボリュームには移動できない形となりますが、
その関数のオプションパラメータにMOVEFILE_COPY_ALLOWED(=0x0002)を指定することで、
内部的に行うファイル複製(=CopyFile関数)と削除(=DeleteFile関数)により、
プログラマは意識することなく、同一ボリュームの移動と同じようにシミュレートできます。
指定フラグは他に移動先に同名ファイルが存在しても上書きするMOVEFILE_REPLACE_EXISTING(=0x0001)、
システムの再起動等、移動のタイミングを次回起動時に行うMOVEFILE_DELAY_UNTIL_REBOOT(=0x0004)や、
移動が完了するまで関数を終了しないMOVEFILE_WRITE_THROUGH(=0x0008)といったものがあるので、
複数指定する場合は論理和(全ての合計値)で指定を行いますが、
移動完了まで処理続行しないMOVEFILE_WRITE_THROUGHと再起動後に行うMOVEFILE_DELAY_UNTIL_REBOOT等、
中には組み合わせできないもの、しても意味がないものもあります。
尚、MOVEFILE_DELAY_UNTIL_REBOOTはNT系のみ実行可能なもので、
9X系では同一ボリュームの移動に限定されますが
WindowsフォルダのWININIT.iniファイルのRenameセクションに
「移動先パス=現在のパス」形式で記述することでフォルダを除くファイルを再起動時に移動できます。
また、「NUL=現在のパス」と指定することで再起動後に削除することも可能となっています。
注意点としては、今回紹介した下記サンプルモジュールでも使用しているAPIのMoveFileExは、
Windows98以前で使用することはできません。
Windows95や98でファイル移動を行う場合は、API関数MoveFileを使用してください。
この関数は、移動先と移動元ファイルを指定するだけで、オプションフラグを指定できないものです。
当然ながら、移動・削除の権限があるユーザーでなければ処理はできませんのでお忘れなく。
	

filemove 移動元, 移動先, オプション
移動元移動元ファイルまたはフォルダのパスを指定する。
移動先移動先ファイルまたはフォルダのパスを指定する。
オプション上書移動(=1)、異なるドライブへの移動許可(=2)、
再起動時に移動(=4)、移動完了まで処理続行しない(=8)オプションを指定する。

 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
	ll_libload kernel, "kernel32.dll"
	ll_getproc MoveFileEx "MoveFileExA", kernel

#module
#deffunc filemove str, str, int
	mref before, 32 : mref after, 33 : mref option, 2
	ll_getptr before : ll_ret prm.0
	if after ! "" : ll_getptr after : ll_ret prm.1 : else : prm.1 = 0
	prm.2 = option
	ll_callfunc prm, 3, MoveFileEx@
	return
#global

	sdim path, 512, 2
	pos  10, 10 : mes "移動元ファイル・フォルダ"
	pos 220, 10 : input path.0, 350, 20
	pos  10, 40 : mes "移動元ファイル・フォルダ"
	pos 220, 40 : input path.1, 350, 20
	pos 220, 70 : button "実行", *move
	stop

*move
	dialog "[" + path + "]を\n[" + path.1 + "]に変更します。\n\n直ちに処理しますか?", 2
	if stat = 6 : filemove path, path.1
	stop

filemove 移動元, 移動先, オプション
移動元移動元ファイルまたはフォルダのパスを指定する。
移動先移動先ファイルまたはフォルダのパスを指定する。
オプション上書移動(=1)、異なるドライブへの移動許可(=2)、
再起動時に移動(=4)、移動完了まで処理続行しない(=8)オプションを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#uselib "kernel32.dll"
#func  global MoveFileEx "MoveFileExA" str, sptr, int

#module
#deffunc filemove str before, str after, int option
	if after = "" : MoveFileEx before, 0, 4 : else : MoveFileEx before, after, option
	return
#global

	sdim path, 512, 2
	pos  10, 10 : mes "移動元ファイル・フォルダ"
	pos 220, 10 : input path.0, 350, 20
	pos  10, 40 : mes "移動元ファイル・フォルダ"
	pos 220, 40 : input path.1, 350, 20
	pos 220, 70 : button gosub "実行", *move
	stop

*move
	dialog "[" + path + "]を\n[" + path.1 + "]に変更します。\n\n直ちに処理しますか?", 2
	if stat = 6 : filemove path, path.1
	return