|
|
2007/3/4(Sun) 13:59:34|NO.6015
ある指定のカレントディレクトリ位置から相対パスでのファイルリストを一括で取得したいの
ですが、うまく実行させることができません。ひとつひとつのフォルダリストをdirlistを使って
いるのですが、どうすればうまく実行させることができるでしょうか?
ご教示お願いします。
|
|
2007/3/4(Sun) 16:37:29|NO.6023
dirlist dir,"*.*",5
dirmax=stat
mes "["+dir_cur+"\\] フォルダ"+dirmax
mes dir
notesel dir
repeat dirmax
noteget dirtmp,cnt
dirlist dirf,dirtmp+"\\*.*",1
pos 100+160*cnt,20+18*cnt
mes "["+dir_cur+"\\"+dirtmp+"\\] ファイル"+stat+"個"
mes dirf
dirlist dirf,dirtmp+"\\*.*",5
mes "[フォルダ] "+stat+"個"
mes dirf
loop
こう言う事じゃ無くて?
|
|
2007/3/4(Sun) 17:00:11|NO.6024
#module
#define global ining(%1,%2=0) _ining %1,%2
#deffunc _ining str dirName,int n,local ram,local rem,local rom
chdir dirName
notesel ram
dirlist ram,"*.*",1
repeat noteinfo(0)
noteget rem,cnt
//ファイルパスに対する処理 開始
mes dir_cur+"\\"+rem
if ginfo(23)>ginfo(13):color:boxf:color 255,255,255:pos ,5
//ファイルパスに対する処理 終了
await 2
loop
dirlist ram,"*.*",5
repeat noteinfo(0)
noteget rem,cnt
noteunsel
ining rem,n+1
notesel ram
await 10
loop
if n:chdir "../"
return
#global
bgscr 0,ginfo(20),ginfo(21),0,0,0
onkey gosub *ent
color:boxf
color 255,255,255:pos 75,5
mes "開始(デスクトップ)"
wait 75
ining dirinfo($10000)
mes "終了(デスクトップ)"
wait 40
mes "開始(Cドライブ)
wait 75
ining "C:\\"
mes "終了(Cドライブ)"
stop
*ent
if wparam=13:end
return
こんな感じじゃないですか?
|
|
2007/3/4(Sun) 18:33:56|NO.6027
hsp3.0aだと
>dirlist dir,"*.*",5
>dirmax=stat
これで、statが何故か2個多い
dirlist dir,"*.*",5
notesel dir
dirmax=noteinfo(0)
ってやれば一応数が分かる
NO.6023のは3.1b7でやると問題ないみたい
|
|
2007/3/5(Mon) 21:52:49|NO.6058
KIMUさん、うひょさん、ありがとうございますペコm(_ _;m)
KIMUさんの方法を試してみたしたが、3階層までしか取得することができませんでした><
うひょさんの方法では、どこまでも階層を取得できるようになっているのでうひょさんのスクリプトを
使わせていただきます<(_ _)>
ご教示ありがとうございました。
|
|
2007/3/5(Mon) 22:05:46|NO.6059
#解決したとおもったのですが、うひょさんのスクリプトも2階層までの取得でしたね(´;ェ;` )
|
|
2007/3/6(Tue) 00:58:35|NO.6064
ファイルの一覧を取得するけど、フォルダがあったらそのフォルダのファイル一覧...2つの一覧をひとつの処理に入れようとするからこんがらがってしまったのだと思います。
まずはフォルダ一覧、ファイル一覧それぞれの処理を作っていけばまぁまぁ簡単にいくはずです。
とりあえずフォルダ一覧はこんな感じでできているかと思います。
sdim now_dir, 260 ; フォルダ取得用
sdim now_file, 260 ; ファイル取得用
g_list = "" ; フォルダ一覧
g_folder_cur = 0: g_folder_max = 0 ; フォルダの現在値 / 最大数
objsize ginfo_winx, ginfo_winy / 2 ; 結果表示用
listbox chk_list, 0, g_list
; フォルダ一覧の取得
repeat
; カレントディレクトリのフォルダ一覧を取得
dirlist s_list, "*.*", 5
ret = stat: g_folder_max += ret
; 取得する一覧がなくなったら終了
if g_folder_max = g_folder_cur: break
; 取得したカレントディレクトリのフォルダを一覧に追加
if ret {
notesel s_list
repeat ret
noteget now_file, cnt
g_list += dir_cur + "\\" + now_file + "\n"
loop
}
; 一覧の中から順次フォルダを取り出して掘り進める
notesel g_list
noteget now_dir, g_folder_cur
chdir now_dir
g_folder_cur++
loop
; 一覧更新
objprm 0, g_list
あとは得られたフォルダ一覧を順番にカレントディレクトリに設定してdirlistでファイル一覧を取得すれば、最初のカレントディレクトリ以下のすべてのファイルの一覧を取得できたことになります。
絶対パスから、相対パスへの変換は一番最後に考えて出来上がりです。
あとはアルゴリズム的に無駄を省いたりするだけで、意外と分解すれば簡単でしょ?
>KIMUさんの方法を試してみたしたが、3階層までしか取得することができませんでした><
明らかに三階層ではないと思います。
カレントディレクトリ内のフォルダ一階層のみしか調べていないコードだからですよ。
| |
|
2007/3/6(Tue) 01:11:00|NO.6066
>KIMUさんの方法を試してみたしたが、3階層までしか取得することができませんでした><
KIMUさん的には
>こう言う事じゃ無くて?
>dirlist dirf,dirtmp+"\\*.*",1
こっちを見てもらいたかった気がします。
|
|
2007/3/6(Tue) 07:57:17|NO.6073
>No.6064
開始時のカレントディレクトリもフォルダ一覧に含め、この一覧をそのまま用いてカレントディレクトリ以下の全ファイルを取得できるようにしました。(フォルダ一覧のみ掲載)
sdim now_dir, 260 ; フォルダ取得用
sdim now_file, 260 ; ファイル取得用
g_list = dir_cur + "\n" ; フォルダ一覧
g_folder_cur = 0: g_folder_max = 1 ; フォルダの現在値 / 最大数
objsize ginfo_winx, ginfo_winy / 2 ; 結果表示用
listbox chk_list, 0, g_list
; フォルダ一覧の取得
repeat
; 取得する一覧がなくなったら終了
if g_folder_max = g_folder_cur: break
; 一覧の中から順次フォルダを取り出して掘り進める
notesel g_list
noteget now_dir, g_folder_cur
chdir now_dir
g_folder_cur++
; カレントディレクトリのフォルダ一覧を取得
dirlist s_list, "*.*", 5
ret = stat: g_folder_max += ret
; 取得したカレントディレクトリのフォルダを一覧に追加
if ret {
notesel s_list
repeat ret
noteget now_file, cnt
g_list += dir_cur + "\\" + now_file + "\n"
loop
}
loop
; 一覧更新
objprm 0, g_list
|
|
2007/3/7(Wed) 05:14:13|NO.6099
>>dirlist dirf,dirtmp+"\\*.*",1
>こっちを見てもらいたかった気がします。
そう、順番にフォルダ名を追加してけば全部収得出来るからね・・・
>Asさん
>#解決したとおもったのですが、うひょさんのスクリプトも2階層までの取得でしたね(´;ェ;` )
うひょさん のは全部取得できてますよ?(空のフォルダは表示してないけど)
うひょさん のと kz3さん のを合わせた感じに作ってみた
#module
#define global dirlistex(%1,%2="",%3="*.*",%4=1,%5=0,%6=0) _dirlistex %1,%2,%3,%4,%5,%6
#deffunc _dirlistex array list,str addpath ,str filemask,int dmod,int pathtyp,int f,local path,local dir,local _addpath
if f=0 {cntdir=0:sdim list,100}
_addpath=addpath
if instr(_addpath,0,":")!1{path=dir_cur+"\\"+_addpath}else{path=_addpath}
dirlist file,path+filemask,dmod
list(cntdir)+path
await 0:title str(path) ;途中[×]で終了できるようにawait
noteunsel :notesel file
repeat noteinfo(0)
noteget dirtmp,cnt
if pathtyp {list(cntdir)+"\n"+dirtmp}else{list(cntdir)+"\n"+path+dirtmp}
loop
cntdir++
dirlist dir,path+"*.*",5
noteunsel :notesel dir
repeat noteinfo(0)
noteunsel :notesel dir :noteget dirtmp,cnt
dirlistex list,addpath+dirtmp+"\\",filemask,dmod,pathtyp,1
loop
return cntdir
#global
screen 0,640,480,0,0,0
//dirlistex p1 ,p2 ,p3 ,p4 ,p5 ,p6
//p1=ファイルリストが入る変数
//p2=相対パス("フォルダ\\" の様に指定)又は絶対パス("D:\\hsp30\\" の様に指定) 省略時はカレントフォルダが指定される
//p3=一覧のためのファイルマスク (元のdirlistに有るp2のと同じ) 省略時"*.*"
//p4=ディレクトリ取得モード (元のdirlistに有るp3のと同じ) 省略時 1
//p5=リストのファイル名にフルパスにするかどうか (0=フルパス 1=パス無し) 省略時 0
//p6=dirlistexを連続で使用したときにp1を初期化するか(0=リスト初期化 1=リスト追加)省略時 0
//statにフォルダの総数が入る(ファイル数じゃない) :p5が1の場合は前回からの継続になる
//リストは
//p5が0の時はlist(0)="フルパスA\\\nフルパスA\\ファイルA1\nフルパスA\\ファイルA2","フルパスAB\\\nフルパスAB\\ファイルB1\nフルパスAB\\ファイルB2"の様に入る
//p5が1の時はlist(0)="フルパスA\\\nファイルA1\nファイルA2","フルパスAB\\\nファイルB1\nファイルB2"の様に入る
dirlistex list,,"*.*",1 ;カレトフォルダ全フルパスでファイルリスト収得
dirlistex list,dir_exe+"\\","*.txt",0,1,1 ;追加でHSPのフォルダ内(パス無しでtxtファイル名のみ)も収得してみる
dirmax=stat
lbox=""
repeat dirmax
noteunsel :notesel list(cnt) :noteget dirtmp,0
lbox+dirtmp+"\n"
xsiz=strlen(dirtmp)
if xsiz>_xsiz{_xsiz=xsiz}
loop
screen 0,limit(6*_xsiz+64,400,ginfo(20))-4,480,0,0,0
pos 4,4 :objsize limit(6*_xsiz+52,388,ginfo(20)-12),limit(dirmax*8,120,480-100)
dirno=-1 :listbox dirno,,lbox
onexit gosub *exit
repeat
if (dirnoold!dirno) and (dirno>=0){
_xsiz=0
noteunsel :notesel list(dirno)
repeat noteinfo(0)
noteget dirtmp,cnt :xsiz=strlen(dirtmp)
if xsiz>_xsiz{_xsiz=xsiz}
loop
screen 1,limit(6*_xsiz+48,200,6*_xsiz+48),limit(noteinfo(0)*12+8,20,480),8+2,200,ginfo(1)+32
noteget dirtmp,0 :title dirtmp
mesbox list(dirno),limit(6*_xsiz+48,200,6*_xsiz+48),limit(noteinfo(0)*12+8,20,480),0
gsel 1,2 :gsel 0 }
dirnoold=dirno :wait 10 :title str(dirno)
loop
stop
*exit
if ginfo(2)=1{gsel 1,-1:gsel 0,1}else{end}
return
#一度削除して、ちょっとスクリプトを修正して再掲載しました
#(width の使い方が意味なかったので、そのへんを修正)
| |
|
2007/3/8(Thu) 01:09:42|NO.6134
ちょっと命令の機能追加
#module
#define global dirlistex(%1,%2="",%3="*.*",%4=1,%5=0,%6=0) _dirlistex %1,%2,%3,(%4),(%5),(%6)
#deffunc _dirlistex array list,str addpath ,str filemask,int dmod,int pathtyp,int f,local path,local dir,local _addpath
if (f\2)=0 {cntdir=0:sdim list,100} ;0と2で初期化
_addpath=addpath
if instr(_addpath,0,":")!1 {path=dir_cur+"\\"+_addpath}else{path=_addpath}
dirlist file,path+filemask,dmod
if f>1 {_cntdir=0}else{_cntdir=cntdir} ;2以上なら要素を増やさない
if f=3 {list(_cntdir)+"\n"+path}else{list(_cntdir)+path} ;要素なしの変数に追加の場合パスが繋がらないように改行
await 0:title str(path) ;途中[×]で終了できるようにawait
noteunsel :notesel file
repeat noteinfo(0)
noteget dirtmp,cnt
if pathtyp {list(_cntdir)+"\n"+dirtmp}else{list(_cntdir)+"\n"+path+dirtmp}
loop
cntdir++
dirlist dir,path+"*.*",5
noteunsel :notesel dir
repeat noteinfo(0)
noteunsel :notesel dir :noteget dirtmp,cnt
dirlistex list,addpath+dirtmp+"\\",filemask,dmod,pathtyp,1|f ;p6のフラグを追加してサブフォルダを追加収得
loop
return cntdir
#global
//追加機能のテストに
screen 0,640,480,0,0,0
//dirlistex p1 ,p2 ,p3 ,p4 ,p5 ,p6 (p1〜p5はNO.6099と同じ)
//p6=dirlistexを連続で使用したときにp1を初期化するか、収得リストの構造設定
//(0=リスト初期化 1=リスト追加 2=初期化して全て一つに入れる 3=追加で全て一つに入れる )省略時 0
//p6が 0 か 1 の時はlist(0)="フルパスA\\\n","フルパスB\\\n"
//p6が 2 か 3 の時はlist(0)="フルパスA\\\nフルパスB\\\n" になる
dirlistex list,,"*.*",5 ;カレトフォルダのサブフォルダ名だけ全収得
dirmax=stat
lbox=""
repeat dirmax
noteunsel :notesel list(cnt) :noteget dirtmp,0
lbox+dirtmp+"\n"
xsiz=strlen(dirtmp)
if xsiz>_xsiz{_xsiz=xsiz}
loop
screen 0,limit(6*_xsiz+64,400,ginfo(20))-4,480,0,0,0
pos 4,4 :objsize limit(6*_xsiz+52,388,ginfo(20)-12),limit(dirmax*8,120,480-100)
dirno=-1 :listbox dirno,,lbox
onexit gosub *exit
repeat
if (dirnoold!dirno) and (dirno>=0){
_xsiz=0
noteunsel :notesel list(dirno) :noteget dirtmp2,0 ;"\n"を無くすのにnotegetを利用
dirlistex meslist,dirtmp2,"*.*",1,0,2 ;要素なしの変数にリスト収得
noteunsel :notesel meslist
repeat noteinfo(0)
noteget dirtmp,cnt :xsiz=strlen(dirtmp)
if xsiz>_xsiz{_xsiz=xsiz}
loop
screen 1,limit(6*_xsiz+48,200,6*_xsiz+48),limit(noteinfo(0)*12+8,20,480),8+2,200,ginfo(1)+32
title dirtmp2
mesbox meslist,limit(6*_xsiz+48,200,6*_xsiz+48),limit(noteinfo(0)*12+8,20,480),0
gsel 1,2 :gsel 0
}
dirnoold=dirno :wait 10 :title str(dirno)
loop
stop
*exit
if ginfo(2)=1{gsel 1,-1:gsel 0,1}else{end}
return
p6を0か1でリストを収得して、そのリストからフォルダ別にサブフォルダのリストを
一つの変数に纏めるには↓な感じ
//この命令をモジュールに追加
#deffunc subdirlist var meslist,array sublist,str dirts,local _dirts ,local listcnt
_dirts=dirts
if instr(_dirts,0,":")!1{pathts=dir_cur+"\\"+_dirts}else{pathts=_dirts}
listmax=length(sublist)
listno=-1
repeat listmax
if instr(sublist(cnt),0,pathts)=0 {listno=cnt:break}
loop
if listno>=0 {
meslist=sublist(listno)
repeat limit(listmax-listno-1,0,listmax),listno+1
if instr(sublist(cnt),0,pathts)=0 {listcnt++ :meslist+"\n"+sublist(cnt)}else{break}
loop
}
return listcnt
//上の
; dirlistex meslist,dirtmp2,"*.*",1,0,2 ;要素なしの変数にリスト収得
//を↓に置き換え
subdirlist meslist,list,dirtmp2
#一度削除して再掲載しました。
#修正が足りない所と処理順がおかしくなる所があったので
#修正箇所だけでなく全て載せました。
| |
|
2007/3/8(Thu) 19:10:33|NO.6151
kz3さんKIMUさんありがとうございます。
こういったプログラムは頭がこんがらがってしまい、ソースをみても動作することはわかっても
どんな動きなのか理解することはできませんでしたが^^;
参考にさせていただきます。
|
|