拡張ファイル操作命令

ファイル操作命令の拡張版です(タイトル通りですが)。

標準命令でファイル操作はコピー、削除、作成、フォルダ作成と言った基本しかできません。

移動はコピー+削除の組み合わせで出来ますが命令がないので置いておきます。

この拡張ファイル命令を使用すれば「高速コピーや移動」「ファイル名変更」「ショートカットファイル作成」

「ファイル属性の取得と設定」「タイムスタンプの取得と設定」「圧縮解凍コピー」ができるようになります。

 

まずは簡単なものから...フォルダ選択ダイアログselfolderを説明いたします。

標準命令にあるdialogのファイルではなくフォルダ選択になっただけである、というだけです。

パラメータは2つでp1は選択したフォルダのフルパスが入ります。

"message"にはダイアログに表示させるメッセージ(省略で「フォルダを選択してください」)を入れます。

選択に失敗・ユーザーのキャンセルが起こると、statに1が、成功すると0が入ります。

また、refstrに選択したフォルダ名(フルパスではない)が入ります。

#include "hspext.as"
	sdim dir,256
	sdim file,32000
	screen 0,400,480
	objsize 400,25
	listbox index,430,file
	button "フォルダ選択",seldir
	stop

*seldir
	selfolder dir,"ディレクトリの一覧を表示したいフォルダを選択してください。"
	if stat : stop
	chdir dir
	dirlist file,"*.*",1
	objprm 0,file
	stop

p1に使用する変数は深い階層のフォルダを選択する場合もありますので大きめに確保しておきましょう。

 

今説明したselfolderを早速フォルダ移動・コピーをするfxcopyに使用してみましょう。

p1は処理対象ファイルの指定を、"dest"にコピー先フォルダを、p2には処理モードを指定します。

0又は省略でコピーを、1で移動を行いますが移動は同じドライブでなければなりません

コピーと言ってもbcopyとは違い、シェルを利用した高速コピーです。ただPACKFILEには対応していません。

#include "hspext.as"
	sdim dir,256
	sdim file,256
	screen 0,320,50
	objsize 320,25
	button "コピーするファイル",selfile
	button "移動するファイル",selfile
	stop

*selfile
	selmode=stat ; 選択モード
	if selmode : msg="移動" : else : msg="コピー"
	dialog"",16,""+msg+"するファイル"
	if stat=0 : stop
	file=refstr
	selfolder dir,msg+"先ディレクトリを選択してください。"
	if stat : stop
	fxcopy file,dir,selmode
	if stat : dialog ""+msg+"に失敗しました"
	stop

 

続いて特殊で使用するには重要なディレクトリの位置・名前を取得するfxdirに入ります。

p1にはp2で指定したディレクトリの種類で取得したフォルダ名を入れる変数を指定します。

いつものことですけど変数は大きめに確保しておきましょう。

p1に取得したフォルダ名を入れる変数、p2に取得するフォルダの種類を指定します。

行数を取ってしまいますけど、ヘルプに書いていた取得できるパラメータとフォルダの種類を書きます。

-1:Windowsの「System」フォルダ
02:スタートメニューの「プログラム」グループフォルダ
05:「マイドキュメント」フォルダ
06:「お気に入り」フォルダ
07:「スタートアップ」フォルダ
08:「最近使った書類」フォルダ
09:「送る」フォルダ
11:「スタートメニュー」フォルダ
16:「デスクトップ」フォルダ
21:「TEMP」フォルダ
26:「Application」フォルダ
27:「プリンタデバイス」フォルダ
32:Internet「キャッシュ」フォルダ
33:Internet「Cookies」フォルダ
34:Internet「履歴」フォルダ

となっているようですが、私の環境(OS:XP_HomeEdition)で調べたところ、

-3以下:Windows「System」フォルダ
-2:現在ログインしているユーザーの「TEMP」フォルダ
-1:Windows「System」フォルダ
00:現在ログインしているユーザーの「デスクトップ」フォルダ
02:現在ログインしているユーザーのスタートメニューの「プログラム」フォルダ
05:現在ログインしているユーザーの「マイドキュメント」フォルダ
06:現在ログインしているユーザーの「お気に入り」フォルダ
07:現在ログインしているユーザーの「スタートアップ」フォルダ
08:現在ログインしているユーザーの「Recent」フォルダ
09:現在ログインしているユーザーの「送る」フォルダ
11:現在ログインしているユーザーの「スタートメニュー」フォルダ
16:現在ログインしているユーザーの「デスクトップ」フォルダ
19:現在ログインしているユーザーの「NetHood」フォルダ
20:「フォント」フォルダ
21:現在ログインしているユーザーの「Templates」フォルダ
22:「スタートメニュー」フォルダ
23:スタートメニューの「プログラム」フォルダ
24:「スタートアップ」フォルダ
25:「デスクトップ」フォルダ
26:現在ログインしているユーザーの「Application Data」フォルダ
27:現在ログインしているユーザーの「PrintHood」フォルダ
28:現在ログインしているユーザーのLocalSettingsの「Application Data」フォルダ
31:「お気に入り」フォルダ
32:現在ログインしているユーザーのInternet「Temporary Internet Files」フォルダ
33:現在ログインしているユーザーのInternet「Cookie」フォルダ
34:現在ログインしているユーザーのInternet「履歴」フォルダ
35:「Application」フォルダ
36:「Windows」フォルダ
37:Windows「System32」フォルダ
38:「Program Files」フォルダ
39:現在ログインしているユーザーの「My Pictures」フォルダ
40:現在ログインしているユーザーのフォルダ
41:Windows「System32」フォルダ
43:「Common Files」フォルダ
45:「Templates」フォルダ
46:「Documents」フォルダ
47:「管理ツール」フォルダ
48:現在ログインしているユーザーの「管理ツール」フォルダ
53:「My Music」フォルダ
54:「My Pictures」フォルダ
56:「Resources」フォルダ

私の環境では、の話であってパソコンによって違うと思われますことをご了承ください。

 

さて情報関連ということで次はfxinfoに入りますね。

p2で指定したドライブ(A〜Z)までのp3で指定する様々な情報を取得しp1の変数に入れることが出来ます。

p1の変数は取得するものによって数値型か文字列型かが違います。

p3で取得するものを選びます。

0でドライブの空き容量(単位.バイト)をp1の数値型変数に入れます。
1でセクタ数/1クラスタをp1の数値型変数に入れます。
2でバイト数/1セクタをp1の数値型変数に入れます。
3で空きクラスタ数をp1の数値型変数に入れます。
4でトータルクラスタ数をp1の数値型変数に入れます。
8でドライブタイプ(HDDであるとかCD-ROMだとか)をp1の数値型変数に入れます。
16でドライブのボリュームラベルをp1の文字列型変数に入れます。
17でファイルシステム名をp1の文字列型変数に入れます。
18でボリュームのシリアル番号をp1の数値型変数に入れます。
19で使用可能なファイルの最大文字数をp1の数値型変数に入れます。
20でファイルシステムフラグをp1の数値型変数に入れます。
32でドライブの残り容量をp1の文字列型変数に入れます。

#include "hspext.as"
	combox drive,200,"A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nL\nM\nN\nO\nP\nQ\nR\nS\nT\nU\nV\nW\nX\nY\nZ"
	button "調べる",check
	stop

*check
	fxinfo info,drive+1,8
	color 255,255,255 : boxf : color
	pos 0,60
	if info=0 : mes "不明なドライブ"
	if info=1 : mes "ドライブなし"
	if info=2 : mes "リムーバブルディスク"
	if info=3 {
		sdim tmp,16
		fxinfo tmp,info,32
		strlen len,tmp
		strmid info2,tmp,0,len-9
		mes "ハードディスク\n残り容量約"+info2+"GB"
	}
	if info=4 : mes "ネットワークドライブ"
	if info=5 : sdim info2,16 : fxinfo info2,drive+1,16 : mes "CD-ROMドライブ\nボリュームラベル"+info2
	if info=6 : mes "RAMドライブ"
	stop

上記サンプルを見ていただければわかりますが取得したいドライブはAが1、Bが2、Cが3…となっています。

0を指定するとカレントドライブになります。

p3に32を指定すると32bitより大きい型で計算されます(多分)ので2G以上の数値にも対応しています。

ただし返ってきた値が2GB以上になることがありますので、HSP本体が32bitしか扱えない為文字列で受けます。

ファイルシステム名とは「FAT」「NTFS」などのことです。

クラスタやセクタについての余談。

セクタとはディスクを分割する最小単位のことで、クラスタはいくつかのセクタをまとめた単位のことです。

セクタのバイト数、セクタがクラスタに入っている数、クラスタ総数がわかればディスク容量が分かります。

また「セクタのバイト数×空きクラスタ数×クラスタに入るセクタ数」で空きディスク容量がわかります。

p3に32を指定するのがあれば0を指定するのはいらないのじゃないのとなりますが、

32指定が使用できるのはOSが95のOemServiceRelease2(OSR2)以降でないと使用できません。

ほとんどが使えるわけですけどね^^;

 

ではショートカットを作成するfxlinkに入りましょう。

"path"で指定したファイルのショートカットをカレントディレクトリにp1の名前で作成します。

URLを指定すればインターネットのショートカットを作成することが出来ます。

これ以上説明のしようがないので説明は以上です。

#include "hspext.as"
	sdim tmpstr,128
	sdim linkname,128
	sdim desktop,128
	dialog "",16
	if stat=0 : end
	tmpstr=refstr
	strlen len,tmpstr
	repeat len,1
		peek tmp,tmpstr,len-cnt
		if tmp='\\' : tmp=len-cnt+1 : break
	loop
	strmid tmpstr,tmpstr,tmp,len-tmp
	repeat tmp
		peek tmp.1,tmpstr,tmp-cnt
		if tmp.1='.' : tmp.1=tmp-cnt : break
	loop
	strmid linkname,tmpstr,0,tmp.1
	fxdir desktop,0 ; デスクトップ取得
	chdir desktop
	fxlink linkname,tmpstr
	if stat : dialog "作成失敗" : end
	dialog "デスクトップに選択したファイルのショートカットを作成しました"
	end

 

さぁどんどん次へ行きましてfxshortに入りたいと思います。

DOSではファイル名が(最大だったかな?)8文字3文字(8文字の自由な名前と3文字の拡張子)となっています。

それ以上の名前の場合名前の部分が8文字になるようにショートネームとなり、

例えば「abcdefghijklmn.txt」とあったとすると「ABCDEF~N.TXT」となります。

#include "hspext.as"
	sdim tmpstr,128
	sdim sname,16
	dialog "",16
	if stat=0 : end
	tmpstr=refstr
	strlen len,tmpstr
	repeat len
		peek tmp,tmpstr,len-cnt
		if tmp='\\' : tmp=len-cnt+1 : break
	loop
	strmid filename,tmpstr,tmp,len-tmp
	fxshort sname,filename;"file"
	mes sname
	stop

上のサンプルはファイル名の2バイトチェックをしていないので「\」が2バイト文字にも引っかかります。

実際に使用する場合にはTIPS集にある2バイト判定を取り入れてください。

このDOSファイルネームを元のロングネームに戻したい場合はdirlistを使います。

 

HSPBCのソフトで昔に作成したものですが「SatoStampChanger」というゴミに近いものがあります。

それは今から説明するタイムスタンプ関係のfxtgetfxtsetを使っていたはずです。

ファイルのプロパティで見れるタイムスタンプというものくらいはご存知ですね?

ファイルのタイムスタンプを取得するのはfxtget、変更するのはfxtsetです。(そのまんま...

取得情報はp1の数値型配列変数に一度に入るので24以上確保しておく必要があります。

00,08,16:年(西暦)
01,09,17:月
02,10,18:曜日(0=日,1=月,2=火…)
03,11,19:日
04,12,20:時
05,13,21:分
06,14,22:秒
07,15,23:ミリ秒

0〜7は作成した日時、8〜15は更新した日時、16〜23は最終アクセスした日時が入ります。

#include "hspext.as"
	sdim file,128
	sdim msg,12,3
	sdim msg2,6,8
	sdim week,2,7
	dim info,24
	msg="作成した","更新した","最終アクセス"
	msg2="年","月","曜日","日","時","分","秒","ミリ秒"
	week="日","月","火","水","木","金","土"
	dialog "",16
	if stat=0 : end
	file=refstr
	font "MS ゴシック",13
	fxtget info,file
	repeat 24
		tmp = cnt / 8 : tmpstr = msg.tmp
		tmp = cnt \ 8 : tmpstr += msg2.tmp
		if cnt \ 8 = 2 : tmp = info.cnt : tmp = week.tmp : else : tmp = info.cnt
		pos cnt / 8 * 220 +  10, cnt \ 8 * 20 + 10 : mes tmpstr
		pos cnt / 8 * 220 + 150, cnt \ 8 * 20 + 10 : mes tmp
	loop
	stop

fxtsetの方は後ほどのサンプルに載せてありますのでソチラをご覧ください。

 

ファイル名を変更できるfxrenに入ります。

p1で指定したファイルを"new name"に変更します。

p1はフルパスを、"new name"はファイル名だけを指定します。

コレも後ほどにサンプルがありますのでソチラをご覧ください。

 

ファイル属性の取得と設定をするfxaget,fxasetを同時に説明します。

属性変更できるp1に設定する値はヘルプでは16進数で書かれていますが、

$  1(  1):書込み禁止
$  2(  2):隠しファイル
$  4(  4):システム
$ 10( 16):ディレクトリ
$ 20( 32):アーカイブ
$ 80( 128):標準タイプ
$ 100( 256):一時ファイル
$ 800(2048):圧縮ファイル
$1000(4096):オフライン

いつもの如く、複数設定したい場合は値を足してください。取得の場合も「&」で取り出せます。

#include "hspext.as"
	sdim file,128
	sdim chgname,128
	sdim msg,16,3
	sdim msg2,6,6
	sdim msg3,14,9
	sdim week,2,7
	dim tstamp,24
	dim tstamp2,24
	dim attribute,9
	dim attribute2,9
	dim param,9
	msg    = "作成日時","更新日時","最終アクセス日時"
	msg2   = "年","月","日","時","分","秒"
	msg3.0 = "書込み禁止","隠しファイル","システム","ディレクトリ","アーカイブ"
	msg3.5 = "標準タイプ","一時ファイル","圧縮ファイル","オフライン"
	week   = "日","月","火","水","木","金","土"
	param  = $1,$2,$4,$10,$20,$80,$100,$800,$1000
	screen 0,520,220
	title "ファイル設定"
	color 192,192,192 : boxf : color
	objsize 260,25
	pos 0,0 : button"開く",open
	pos 260,0 : button"現在の設定に変更",save
	pos 5,32 : mes "ファイル名"
	pos 90,30 : input chgname,425
	repeat 3
		pos 5,cnt*25+60 : mes msg.cnt
		pos 150,cnt*25+60 : tmp=cnt*8+0 : input tstamp.tmp,40,,4 : pos 195,cnt*25+63 : mes msg2.0
		pos 215,cnt*25+60 : tmp=cnt*8+1 : input tstamp.tmp,25,,2 : pos 245,cnt*25+63 : mes msg2.1
		pos 265,cnt*25+60 : tmp=cnt*8+3 : input tstamp.tmp,25,,2 : pos 295,cnt*25+63 : mes msg2.2
		pos 330,cnt*25+60 : tmp=cnt*8+4 : input tstamp.tmp,25,,2 : pos 360,cnt*25+63 : mes msg2.3
		pos 380,cnt*25+60 : tmp=cnt*8+5 : input tstamp.tmp,25,,2 : pos 410,cnt*25+63 : mes msg2.4
		pos 430,cnt*25+60 : tmp=cnt*8+6 : input tstamp.tmp,25,,2 : pos 455,cnt*25+63 : mes "."
		pos 465,cnt*25+60 : tmp=cnt*8+7 : input tstamp.tmp,32,,3 : pos 500,cnt*25+63 : mes msg2.5
	loop
	objsize 12,12
	repeat 9
		pos cnt\3*180+15,cnt/3*25+145 : chkbox "",attribute.cnt
		pos cnt\3*180+40,cnt/3*25+142 : mes msg3.cnt
	loop
	stop

*open
	dialog "",16
	if stat {
		file=refstr
		strlen len,file
		repeat len,1
			peek tmp,file,len-cnt
			if tmp='\\' : tmp=len-cnt+1 : break
		loop
		strmid chgname,file,tmp,len-tmp
		objprm 2,chgname
		fxtget tstamp,file ; タイムスタンプ取得
		tmp=0 ; オブジェクトID
		repeat 24
			if cnt\8=2 : continue
			objprm 3+tmp,tstamp.cnt
			tmp+
		loop
		fxaget attribute,file ; 属性取得
		repeat 9
			if attribute&param.cnt : objprm 24+cnt,1 : else : objprm 24+cnt,0
		loop
	}
	stop

*save
	tmp=0 ; 保存用フラグ
	attribute2=0 ; 属性初期化
	fxtget tstamp2,file
	fxtset tstamp,file
	if stat=1 : tmp=1 : dialog "タイムスタンプの保存に失敗しました" : stop
	repeat 9
		if attribute.cnt : attribute2+=param.cnt
	loop
	fxaset file,attribute2
	if stat=1 : tmp=1 : dialog "属性の保存に失敗しました" : stop
	fxren file,chgname
	if stat=1 : tmp=1 : dialog "ファイル名変換に失敗しました" : stop
	dialog"保存に成功しました"
	stop

結構長いサンプルとなってしまいコレだけでもひとつのソフトとして十分いける気がしますが...(--;

 

最後の命令2つは「lz〜」という圧縮解凍に関する命令です。

「lz〜」はWindows3.1時代のcompress.exeで圧縮されたファイルを解凍するものです。

使用するにはまずlzdistで圧縮の解凍先ディレクトリで指定しなければなりません。

解凍先を決めたらlzcopyで圧縮ファイルを解凍するわけですが、拡張子は入れないでください。

#include "hspext.as"
	sdim dir,256
	sdim file,256
	dialog "",16
	if stat=0 : end
	file=refstr
	strlen len,file
	repeat len,1
		peek tmp,file,len-cnt
		if tmp='.' : tmp.1=cnt
		if tmp='\\' : tmp.2=len-cnt+1 : break
	loop
	strmid file,file,tmp.2,len-tmp.2-tmp.1
	selfolder dir,"解凍先フォルダを選んでください"
	if stat : end
	lzdist dir
	lzcopy file
	if stat : dialog "解凍失敗"

 

それではコレにてHSPEXT.DLLの命令解説を終了したいと思います。