ファイル操作命令の拡張版です(タイトル通りですが)。
標準命令でファイル操作はコピー、削除、作成、フォルダ作成と言った基本しかできません。
移動はコピー+削除の組み合わせで出来ますが命令がないので置いておきます。
この拡張ファイル命令を使用すれば「高速コピーや移動」「ファイル名変更」「ショートカットファイル作成」
「ファイル属性の取得と設定」「タイムスタンプの取得と設定」「圧縮解凍コピー」ができるようになります。
まずは簡単なものから...フォルダ選択ダイアログ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」というゴミに近いものがあります。
それは今から説明するタイムスタンプ関係のfxtgetとfxtsetを使っていたはずです。
ファイルのプロパティで見れるタイムスタンプというものくらいはご存知ですね?
ファイルのタイムスタンプを取得するのは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進数で書かれていますが、
いつもの如く、複数設定したい場合は値を足してください。取得の場合も「&」で取り出せます。
#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¶m.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の命令解説を終了したいと思います。