〜 ファイル編 〜

01.フォルダの有無チェック

02.フォルダ直下の総ファイルサイズ

03.ファイルオープンダイアログ(16)で複数拡張子に対応させる

04.特殊なフォルダを開く

05.フォルダの削除

06.フルパスからファイル名を取り出す

07.ファイル名から拡張子を抜き出すモジュール

08.保存ダイアログのファイル名の拡張子が消されていても強制的につける

09.標準命令でファイル名を変更するモジュール

10.変数の内容を外部に保存・呼び出す

11.ファイル属性取得モジュール (要llmod.as)

12.ファイル属性設定モジュール (要llmod.as)

13.INIファイルから情報取得するモジュール (要llmod.as)

14.INIファイルに情報設定するモジュール (要llmod.as)

15.ファイル移動(ファイル名置換)モジュール (要llmod.as)

16.ファイルを読み込んで中のテキストを命令として実行する

17.ドライブ情報取得 (要llmod.as)

18.ドライブ一覧取得 (要llmod.as)


01.フォルダの有無チェック

  ファイルでしたらexist命令にて調べることができますがフォルダはexistで調べることはできません。
  dirlist命令を使用すればシステム変数statに結果が返ってきます。
  0なら存在しない、1なら存在する、です。

  (例)フォルダチェック

 folder="d:\\HSP\\common"
 dirlist buf,folder,5
 if stat==0 : dialog"存在しません"
 stop

TOPへ戻る

02.フォルダ内の総ファイルサイズ

  フォルダ内のサイズは命令を組み合わせることによって比較的簡単に調べることができます。
  ただ、それはフォルダ直属のファイルサイズの話です。フォルダ内にフォルダがある場合は少々面倒です。
  ここではフォルダ直属のファイルサイズ合計の取得をします。
  フォルダの総サイズ取得は下記のサンプルを各自変更してご利用ください。

  (例)ファイル合計サイズ取得

 sdim folder,16000
 sdim file,32000
 width 400,245
 title "ディレクトリサイズチェッカー"
 objsize 200,25
 pos 0,0 : button "ディレクトリ移動",chg
 pos 200,0 : button "サイズ取得",size
 objsize 400,25
 dirlist folder,"*.*",5
 pos 0,25 : listbox list,200,folder
 stop

*chg
 if list<0 : list=1
 notesel folder
 noteget chgdir,list
 chdir chgdir
 dirlist folder,"*.*",5
 objprm 2,folder
 stop

*size
 notesel folder
 noteget chgdir,list
 tmpdir=curdir ; dirlist対象を変更するため後で戻せるように覚えておく
 chdir chgdir
 dirlist file,"*.*",1
 notesel file
 notemax max
 allsize=0
 repeat max
  noteget tmp,cnt
  exist tmp
  allsize+=strsize
 loop
 dialog""+allsize+"バイト"
 chdir tmpdir
 stop

TOPへ戻る

03.ファイルオープンダイアログ(16)で複数拡張子に対応させる

  リファレンスでは複数の拡張子に対応させる方法が記述されていません。
  「;」(セミコロン)を挟むことでいけるようです。
  また初めに書く拡張子はそのままで、2つ目以降は「*.」+拡張子で指定します。
  この方法はセーブダイアログでも使えます。

  (例)bmp,jpg,mag形式を選択可能にする

 dialog"bmp;*.jpg;*.mag",16
 if stat==0 : end ;キャンセルした場合終了する
 picload refstr
 stop

TOPへ戻る

04.特殊なフォルダを開く

  以前はコントロールパネル一つだけ載せていたのですが、他のもCLSIDパスで開けてみましょう。
  Takaさん(98SE)の情報によると、下のやり方では開けなかったようです。
  「exec "explorer.exe ::{XXX}"」のようにすると動く、との情報を頂きました。ありがとうございます。

  (例)起動

 exec "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}",16 ; コントロールパネル
 exec "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{BDEADF00-C265-11d0-BCED-00A0C90AB50F}",16 ; Webフォルダ
 exec "::{645FF040-5081-101B-9F08-00AA002F954E}",16 ; ゴミ箱
 exec "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}",16 ; マイコンピュータ
 exec "::{208D2C60-3AEA-1069-A2D7-08002B30309D}",16 ; ネットワークコンピュータ
 exec "::{450D8FBA-AD25-11D0-98A8-0800361B1103}",16 ; マイドキュメント
 stop

TOPへ戻る

05.フォルダの削除

  標準命令にフォルダを削除する命令がありません。
  DOSコマンドを使うことで消すことが出来ますので、DOSプロンプトを立ち上げ消しましょう。
  気をつけることが一点。DOSコマンドの「rmdir」は空のフォルダのみ削除が出来るものです。
  もし空でないものを消したい場合はdeleteで消してから実行してください。

  (例)フォルダ削除

 dir="tempdir"
 repeat -1,1
  dirlist tmp,dir,5
  if stat=0 : break
  dir="tempdir"+cnt
 loop
 mkdir dir
 dialog ""+curdir+"に"+dir+"フォルダを作成しました"
 dialog ""+curdir+"\\"+dir+"フォルダを削除します\n実行してよろしいですか?",3
 if stat=6 : exec "cmd.exe /c rmdir "+curdir+"\\"+dir

TOPへ戻る

06.フルパスからファイル名を取り出す

  dirlistの"ファイルマスク"の部分にフルパスを指定してやるとファイル名を取り出せるようです。

  (例)オープンダイアログで開いたファイル名を取り出す

 sdim pass,256 ; フルパス用のサイズ確保
 sdim file,128 ; ファイル名用のサイズ確保
 dialog "",16
 v stat!=1 : end ; キャンセル又はエラーが出ると終了
 pass=refstr
 dirlist file,pass
 mes "フルパス : "+pass
 mes "ファイル名 : "+file
 stop

TOPへ戻る

07.ファイル名から拡張子を抜き出すモジュール

  取り出し方は非常に簡単なのですが要望が多かったので載せておきます。
  取り出し方はいろいろあります。後ろから○文字抜き出すとか「.」(ピリオド)まで抜き出すとか…
  後ろから○文字というやり方では「*.as」のようなものから「*.jpeg」のような数の異なるものには対応できません。
  ということで最後の文字から「.」(ピリオド)まで抜き出す方法を書きます。
  ピリオドまではpeek命令で抜き出しています。ピリオドはASCIIコードで46です。

  (例)拡張し抜き出し

;************************** 概要説明 ************************
;
; extension p1
;
; p1 : 文字列型変数
;
; 取り出された拡張子はrefstrに返ります
; 取得した場合はstatに1が入ります
;
;***********************************************************
#module "CardinalNumberChange"
#deffunc extension val
 mref buf,24
 mref stt,64
 mref result,65
 strlen len,buf
 repeat len,1
  peek tmp,buf,len-cnt
  period=len-cnt
  if tmp=46 : break
 loop
 if period : strmid result,buf,period+1,10 : else : stt=1
 return
#global ; ***** ここまでがモジュール ここから下がサンプル *****

 sdim buf,256
 buf="c:\\program files\\HSP\\hsed2.exe"
 extension buf
 if stat : dialog "拡張子が存在しません" : stop
 mes "「"+buf+"」の拡張子は「"+refstr+"」です"
 stop

TOPへ戻る

08.保存ダイアログのファイル名の拡張子が消されていても強制的につける

  21の拡張子抜き出しの応用(?)ですがほとんど同じですので書かなくても良かったのですが…。
  一応掲示板で質問がありましたので載せておくことにします。

  (例)必ず拡張子つきのファイル名にする

 sdim file,256
 buf="sample document"
 dialog "txt",17
 if stat=0 : dialog "保存に失敗またはキャンセルされて保存されませんでした"
 file=refstr
 strlen len,file
 ichi=len-1
 repeat len
  peek tmp,file,ichi
  if tmp='.' : break
  ichi-
 loop
 strmid chk,file,ichi,len-ichi ; ファイル名「〜.xxx」内のピリオド以降「.xxx」を抜き出す
 if chk!=".txt" : file+=".txt" ; 取り出した拡張子が指定のものでない場合はファイル名に拡張子付加
 strlen len,buf
 bsave file,buf,len
 dialog "保存に成功しました"

TOPへ戻る

09.標準命令でファイル名を変更するモジュール

  hspext.dllにファイル名を変更する命令fxrenがありますが、
  ファイル名変更だけするのにDLLの使用は使いたくないと言う人用です。
  使い方等もfxren命令同様で正常終了するとstatに0,失敗で1が入ります。

  (例)ファイル名置換

;************************** 概要説明 ************************
;
; fnren p1,"name"
;
; p1=変数   : オリジナルのファイル名が格納された文字列型変数名
; "new name" : 新規ファイル名
;
;***********************************************************
#module "change"
#deffunc fnren val,str
 mref p1,24
 mref p2,33
 mref stt,64
 skiperr 1
 peek chk,p1,1
 if chk!=':' : p1=curdir+"\\"+p1
 peek chk,p2,1
 if chk!=':' : p2=curdir+"\\"+p2
 bcopy p1,p2
 if err : stt=1 : return
 skiperr 0
 delete p1
 stt=0
 return
#global ; ***** ここまでがモジュール ここから下がサンプル *****

 sdim file,128
 file="d:\\hsp\\hsptmp"
 fnren file,"success.txt"
 if stat : dialog"変更失敗" : else : dialog"変更完了"

TOPへ戻る

10.変数の内容を外部に保存・呼び出す

  ゲームのハイスコアを保存する、ツールの設定を保存する…これらのデータはHSPの終了とともに消えてしまいます。
  次回起動した時にこれらのデータを使いたいのであればハードディスク等にファイルとして出力して次回読み込ませます。
  保存する形と読み込む形が同じであればどんな風に保存してもかまいません。
  データをカンマで区切る、1行が1データとする、数値データは0で桁を揃える、と言ったことも出来ます。
  またデータが配列変数である場合、配列の状態を維持したまま保存できます。

  (例)1行を1つのデータとして保存・読込

 sdim buf,20,5
 sdim savefile,128
 exist "sample_save.dat" ; 外部に保存してあるか確認
 if strsize>=0 {
  bload "sample_save.dat",savefile ; 存在すれば読み込む
  notesel savefile
  repeat 5
   noteget buf.cnt,cnt ; 1行ずつ読み込んでbufの0から順に入れていく
  loop
 }
 repeat 5
  input buf.cnt,200,25,20 ; inputを5個配置
 loop
 button "save",*save
 stop

*save
 exist "sample_save.dat" ; 上書き確認用
 if strsize>=0 {
  dialog"既にsample_save.datが存在します\n上書きしてよろしいですか?",3
  if stat==7 : stop ; いいえを押したときストップ
 }
 savefile="" ; 必ず空にしておく
 repeat 5
  savefile+=""+buf.cnt+"\n"
 loop
 strlen size,savefile ; 変数のサイズを測る
 bsave "sample_save.dat",savefile,size
 dialog "保存完了"
 stop

TOPへ戻る

11.ファイル属性取得モジュール (要llmod.as)

  hspext.dllにあるfxaget命令を真似たモジュールです。
  指定の形・返ってくるものも同じにしてみました。

属性   内容
--------------------------
 $1 : 書き込み禁止
 $2 : 隠しファイル
 $4 : システム
$10 : ディレクトリ
$20 : アーカイブ
$80 : 標準タイプ

  (例)ファイル属性を取得

#include "llmod.as"
;************************** 概要説明 ************************
;
; getattribute v1,"file"
;
; v1=変数名 : 情報が格納される数値型変数名
; "file"  : 情報を代入する変数
;
; 同時に複数の属性が設定されている場合は、それぞれの値を足した値になります。
; 命令の実行に失敗すると、システム変数statに1が代入されます。
; 正常に終了した場合は、システム変数statは0になります。
;
;***********************************************************
#module "fileinfo"
#deffunc getattribute val,str
 mref type,16
 mref dummy,33
 mref stt,64
 lpfilename=dummy
 getptr prm,lpfilename
 dllproc "GetFileAttributesA",prm,1,D_KERNEL@
 if dllret@=-1 : stt=1 : else : stt=0
 type=dllret@
 return
#global ; ***** ここまでがモジュール ここから下がサンプル *****

 sdim typename,20,6
 dim type,6
 dim info,6
 typename="読み取り専用","隠しファイル","システムファイル","ディレクトリ","アーカイブ","無属性"
 type=$1,$2,$4,$10,$20,$80
 dialog"",16,"属性を取得するファイル"
 if stat=0 : end
 file=refstr
 getattribute info,file
 repeat 6
  if type.cnt&info : mes typename.cnt
 loop
 stop

TOPへ戻る

12.ファイル属性設定モジュール (要llmod.as)

  hspext.dllにあるfxaset命令を真似たモジュールです。
  複数指定したい時は指定したい属性の値をすべて足してください。

属性   内容
--------------------------
 $1 : 書き込み禁止
 $2 : 隠しファイル
 $4 : システム
$10 : ディレクトリ
$20 : アーカイブ
$80 : 標準タイプ

  (例)ファイル属性を設定

#include "llmod.as"
;************************** 概要説明 ************************
;
; setattribute "file",n1
;
; "file"  : 情報を代入する変数
; n1=0〜(0) : 設定する属性
;
; 命令の実行に失敗すると、システム変数statに1が代入されます。
; 正常に終了した場合は、システム変数statは0になります。
;
;***********************************************************
#module "fileinfo"
#deffunc setattribute str,int
 mref dummy,32
 mref type,1
 mref stt,64
 lpfilename=dummy
 getptr prm,lpfilename
 dllproc "SetFileAttributesA",prm,1,D_KERNEL@
 if dllret@=0 : stt=1 : else : stt=0
 return
#global ; ***** ここまでがモジュール ここから下がサンプル *****

 sdim file,256
 dim type,6
 dim typenum,6
 dim info,1
 typenum=$1,$2,$4,$10,$20,$80
 objsize 150,25
 pos 50,50 : mes "指定ファイルパス"
 pos 200,50 : input file,300
 pos 200,100 : chkbox "読み取り専用",type
 pos 200,150 : chkbox "隠しファイル",type.1
 pos 200,200 : chkbox "システムファイル",type.2
 pos 200,250 : chkbox "ディレクトリ",type.3
 pos 200,300 : chkbox "アーカイブ",type.4
 pos 200,350 : chkbox "無属性",type.5
 pos 200,400 : button "設定",set
 stop

*set
 info=0
 repeat 6
  if type.cnt : info+=typenum.cnt
 loop
 setattribute file,info
 if stat : dialog"設定失敗" : else : dialog"設定成功"
 stop

TOPへ戻る

13.INIファイルから情報取得するモジュール (要llmod.as)

  「*.ini」ファイルの指定セクションのキーを取得するモジュールです。
  返って来る型は文字列型ですが数値データでも取得できます。
  当然文字列型の数値となっているわけですので数値として使用する場合int命令で数値化してください。
  取得するためにはiniファイル名,セクション名([]で括られた文字列),キー名の3点指定しなければなりません。
  これらはp2に指定する要素数3以上の配列変数に「ini,セクション,キー」の順番で指定してください。
  取得成功するとstatに取得文字(バイト)数が入ります。

  (例)ini取得

#include "llmod.as"
#define section "MCI Extensions.BAK"
#define key "mpeg"
#define ini "win.ini"
;************************** 概要説明 ************************
;
; inigetstr v1,v2
;
; v1=文字列型変数   : 取得した文字列
; v2=文字列型配列変数 : 取得するもの(要素0=INIファイル名,要素1=セクション名,要素2=キー名)
; 戻り値       : statに文字列の長さ
;
;***********************************************************
#module "ini"
#deffunc inigetstr val,val
 mref lpretstr,24
 mref key,57
 mref stt,64
 dim prm,6
 getptr prm.0,key.1
 getptr prm.1,key.2
 prm.2=0
 getptr prm.3,lpretstr
 prm.4=255
 getptr prm.5,key.0
 dllproc "GetPrivateProfileStringA",prm,6,D_KERNEL@
 if dllret@=-2 : stt=0 : else : stt=dllret@
 return
#global ; ***** ここまでがモジュール ここから下がサンプル *****

 sdim result,256
 sdim info,128,3
 info=ini,section,key
 inigetstr result,info
 mes ""+ini+"\n["+section+"] "+key+"="+result
 stop

TOPへ戻る

14.INIファイルに情報設定するモジュール (要llmod.as)

  「*.ini」ファイルの指定セクションのキーに設定するモジュールです。
  31で書き忘れていましたがINIファイルパスが絶対パスでない場合Windowsフォルダになります。
  指定ファイル・セクションやキーがない場合は自動で作成されます。

  (例)ini設定

#include "llmod.as"
#define section "SectionName1"
#define key "sample"
#define ini "writetest.ini"
;************************** 概要説明 ************************
;
; inisetstr v1,v2
;
; v1=文字列型変数   : 設定する文字列
; v2=文字列型配列変数 : 設定箇所(要素0=INIファイル名,要素1=セクション名,要素2=キー名)
; stat=戻り値     : 0=正常終了,1=失敗
;
;***********************************************************
#module "ini"
#deffunc inisetstr val,val
 mref lpretstr,24
 mref key,57
 mref stt,64
 dim prm,4
 getptr prm.0,key.1
 getptr prm.1,key.2
 getptr prm.2,lpretstr
 getptr prm.3,key.0
 dllproc "WritePrivateProfileStringA",prm,4,D_KERNEL@
 if dllret@ : stt=0 : else : stt=1
 return
#global ; ***** ここまでがモジュール ここから下がサンプル *****

 sdim param,16
 sdim info,128,3
 param="書き込みテスト"
 info=ini,section,key
 inisetstr param,info
 if stat : dialog"書き込み失敗" : else : dialog"書き込み成功"

TOPへ戻る

15.ファイル移動(ファイル名置換)モジュール (要llmod.as)

  既存のファイルを移動・名前置換をするモジュールです。
  元々はファイル移動用に作ったのですがファイル移動で移動元のファイルをフルパスで指定し、
  移動先もフルパスで指定なので、同じフォルダに違う名前ですれば置換と同じだなと思って書いただけです。
  移動に成功するとシステム変数statに0が、失敗すると1が入ります。
  hspext.dllにあるファイルを移動できるfxcopy命令は同一ドライブ間でなければならないようですが、
  このモジュールでは別のドライブであっても移動できます。

  (例)ファイル移動

#include "llmod.as"
;************************** 概要説明 ************************
;
; fmove v1,v2
;
; v1=文字列型変数 : コピー元のファイル名(フルパス)
; v2=文字列型変数 : コピー先のファイル名(フルパス)
; stat=戻り値   : 0=正常終了,1=失敗
;
;***********************************************************
#module "file"
#deffunc fmove val,val
 mref file,24
 mref path,25
 mref stt,64
 mplace=path
 getptr prm.0, file
 getptr prm.1, mplace
 dllproc "MoveFileA",prm,2,D_KERNEL@
 stt=1-dllret@
 return
#global ; ***** ここまでがモジュール ここから下がサンプル *****

 sdim file,256
 sdim newfile,256
 pos 100,50 : mes "移動元ファイル名"
 pos 250,50 : input file,200
 pos 450,50 : button "参照",select
 pos 100,80 : mes "移動先ファイル名"
 pos 250,80 : input newfile,200
 pos 300,150 : button "実行",move
 stop

*select
 dialog "",16
 if stat : objprm 0,refstr
 stop

*move
 fmove file,newfile
 if stat : dialog "失敗しました" : else : dialog "移動完了"
 stop

TOPへ戻る

16.ファイルを読み込んで中のテキストを命令として実行する

  他所であった質問に答えた時のものです。
  ノベルゲーム作成ツール等を作る時とかに必要になることでしょう。

  (例)命令(独自の形式)の取得

 sdim data,1024
 exist "novel.txt"
 if strsize<0 {
  data ="size\"13\"\n"
  data+="text\"はじめまして、\"\n"
  data+="text\"自己紹介をさせていただきます。\"\n"
  data+="text\"私の名前は\"\n"
  data+="wait\"50\"\n"
  data+="size\"20\"\n"
  data+="color\"000000200\"\n"
  data+="speed\"150\"\n"
  data+="text\"アルティメット\"\n"
  data+="size\"13\"\n"
  data+="color\"000000000\"\n"
  data+="speed\"0\"\n"
  data+="text\"です。\"\n"
  data+="wait\"100\"\n"
  data+="text\"「http://www.rinku.zaq.ne.jp/ultimate/」に\"\n"
  data+="color\"255000000\"\n"
  data+="speed\"150\"\n"
  data+="text\"HotSoupProcessorBeginner'sClub\"\n"
  data+="color\"000000000\"\n"
  data+="speed\"0\"\n"
  data+="text\"というHSPに関するページを開いています。\"\n"
  strlen size,data
  bsave "novel.txt",data,size
 }
 bload "novel.txt",data
 notesel data
 notemax max
 repeat max
  noteget tmp,cnt
  getstr command,tmp,0,'"'
  if command="size" : getstr tmp,tmp,strsize,'"' : int tmp : ;font "MS ゴシック",tmp
  if command="text" : getstr tmp,tmp,strsize,'"' : mes tmp
  if command="color" : getstr tmp,tmp,strsize,'"' : strmid rr,tmp,0,3 : int rr : strmid gg,tmp,3,3 : int gg : strmid bb,tmp,6,3 : int bb : color rr,gg,bb
  if command="speed": getstr tmp,tmp,strsize,'"' : int tmp : text tmp
  if command="wait" : getstr tmp,tmp,strsize,'"' : int tmp : wait tmp
 loop
 stop

実行しなくてもわかるかと思いますがココでの命令説明。
text」が文字列を表示する命令(mesのこと)。
size」は文字サイズを変更する命令(fontのサイズ指定部分のみ)。
color」は文字色の変更(colorのこと)。
speed」は文字表示速度(textのこと)。
wait」はそのままのwaitのことで、
形式は「ステートメント"パラメータ"」といったものです。
まず命令名を取得し、ダブルクォートから次のダブルクォートまでをその命令のパラメータとします。
そのまま「novel.txt」と言うファイルで書き出すため誰でもストーリー等を見ることが出来てしまいます。
ソレが嫌な方は保存時に暗号化し、ロード時に復号化すればだいぶマシかと思います。

TOPへ戻る

17.ドライブ情報取得 HSP2.6以上

  hspext.dllにあるfxinfo命令と同じようなことをするモジュールです。
  ドライブ指定をfxinfoと同じにしようとしたけどカレントドライブ取得に失敗したのでドライブ名の直接指定にしました。
  NULLを指定すればいけたはずなんですが(グチ
  2GB以上のHDDをパラメータ4以下で取得しようとした場合fxinfoだと-1という結果になりますが
  このモジュール(5以下)ではオーバーフローしたウソの結果がでてきます^^;
  で、なぜ(0と32)2パターンもあるかというのはhspext.dll側の講座に書いてます。知りたい方はソチラをご覧ください。
  それで32を指定すると大容量にも対応した結果が返ってくるようですがコレもうまくいきませんでしたので
  勝手にKB単位で取得する形にしました。お詫びとして5と33の指定で総容量の指定をできるようにもしました^^;
  肝心なこと忘れてました。fxinfoでは文字列型と数値型指定の2パターンありますが、
  モジュールではできないので指定を文字列型変数にしてください。結果が数値でも文字列型となります。

p3  情報の内容
--------------------------------
 0 : ドライブの残り容量(byte)
 1 : 1クラスタあたりのセクタ数
 2 : 1セクタあたりのバイト数
 3 : 空きクラスタ数
 4 : トータルのクラスタ数
 5 : ドライブの総容量(byte)
 8 : ドライブのタイプ
16 : ボリュームラベル名
17 : ファイルシステム名
18 : ボリュームシリアル番号
19 : 使用可能な最大ファイル文字数
20 : ファイルシステムフラグ
32 : ドライブの残り容量(Kbyte) (大容量対応)
33 : ドライブの総容量(Kbyte) (大容量対応)

  命令の実行に失敗すると、システム変数statに1が代入されます。
  正常に終了した場合は、システム変数statは0になります。

タイプ   内容
--------------------------------
0 : 不明なドライブ
1 : ドライブなし
2 : リムーバブルディスク
3 : ハードディスク
4 : リモート(ネットワーク)ドライブ
5 : CD-ROMドライブ
6 : RAMディスク

  (例)ドライブ情報取得

#include "llmod.as"
;************************** 概要説明 ************************
;
; driveinfo v1,"string",n3
;
; v1=文字列型変数 : 情報が格納される変数名
; "string"    : ドライブ指定
; n3=数値     : 情報タイプ指定
;
;***********************************************************
#module "system"
#deffunc driveinfo val,str,int
 mref var,24
 mref root,33
 mref type,2
 mref stt,64
 mref pval2,1024
 sdim bufstr,pval2.2*4,2
 dim bufnum,4
 peek chk,root
 if (chk<'A'|(chk>'Z'))&(chk<'a'|(chk>'z')) : return
 root+=":\\"
 if type>15&(type<21) {
  dim prm,8
  getptr prm.0,root
  getptr prm.1,bufstr.0
  prm.2=pval2.2*4
  getptr prm.3,bufnum.0
  getptr prm.4,bufnum.1
  getptr prm.5,bufnum.2
  getptr prm.6,bufstr.1
  prm.7=pval2.2*4
  dllproc "GetVolumeInformationA",prm,8,D_KERNEL@
  if dllret@ : stt=0 : else : stt=1
  switch type
   case 16 : var=bufstr.0 : swbreak
   case 17 : var=bufstr.1 : swbreak
   case 18 : var=""+bufnum.0 : swbreak
   case 19 : var=""+bufnum.1 : swbreak
   case 20 : var=""+bufnum.2
  swend
 } else {
  if type=8 {
   getptr prm.0,root
   dllproc "GetDriveTypeA",prm,1,D_KERNEL@
   var=""+dllret@
   stt=0
  } else {
   if type>31 {
    chk=0
    getptr prm.0,root
    getptr prm.1,chk
    getptr prm.2,bufnum
    getptr prm.3,bufnum.2
    dllproc "GetDiskFreeSpaceExA",prm,4,D_KERNEL@
    if dllret@ : stt=0 : else : stt=1
    switch type
     case 32 : bufnum=bufnum.2>>10 & $3fffff + (bufnum.3<<22) : var=""+bufnum : swbreak
     case 33 : bufnum=bufnum.0>>10 & $3fffff + (bufnum.1<<22) : var=""+bufnum
    swend
   } else {
    getptr prm.0,root
    getptr prm.1,bufnum.0
    getptr prm.2,bufnum.1
    getptr prm.3,bufnum.2
    getptr prm.4,bufnum.3
    dllproc "GetDiskFreeSpaceA",prm,5,D_KERNEL@
    if dllret@ : stt=0 : else : stt=1
    switch type
     case 0 : chk=bufnum.0*bufnum.1*bufnum.2 : var=""+chk : swbreak
     case 1 : var=""+bufnum.0 : swbreak
     case 2 : var=""+bufnum.1 : swbreak
     case 3 : var=""+bufnum.2 : swbreak
     case 4 : var=""+bufnum.3 : swbreak
     case 5 : chk=bufnum.0*bufnum.1*bufnum.3 : var=""+chk
    swend
 }}}
 return
#global ; ***** ここまでがモジュール ここから下がサンプル *****

 sdim info,16,7
 sdim infotitle,32,7
 infotitle.0="ボリュームラベル","ファイルシステム","シリアル番号","使用可能最大ファイル数"
 infotitle.4="ファイルシステムフラグ","ドライブ空き容量","ドライブ総容量"
 dim type,7
 type=16,17,18,19,20,32,33
 repeat 7
  pos 50,cnt*50+50 : mes infotitle.cnt
  driveinfo info,"C",type.cnt
  pos 300,cnt*50+50 : mes info
 loop
 stop

TOPへ戻る

18.ドライブ一覧取得 HSP2.6以上

  17の応用です。自分の作成しているプログラムでこの処理が必要になったため、17を利用してやってみました。
  タイトルから想像できるかと思いますが、言うなれば「マイコンピュータ」のようなドライブの一覧を知るものですね。

#include "llmod.as"
 sdim all, 128
 sdim drive, 4
 sdim drivename, 16, 6
 drivename = "Unknown", "NoDrive", "Removable", "HardDisk", "NetWorkDrive", "CD/DVD-ROM", "RamDisk"
 repeat 26
  poke drive, 0, cnt + 65
  poke drive, 1, ':'
  poke drive, 2, '\\'
  getptr prm, drive
  dllproc "GetDriveTypeA", prm, 1, D_KERNEL
  if dllret < 2 : continue
  if all != "" : all += "\n"
  all += drive + " " + drivename.dllret
 loop
 font "MS ゴシック", 15
 objmode 2
 objsize 200, 25
 stop

TOPへ戻る