HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0304
Asディレクトリ下の全ファイルパスを取得11解決


As

リンク

2007/3/4(Sun) 13:59:34|NO.6015

ある指定のカレントディレクトリ位置から相対パスでのファイルリストを一括で取得したいの
ですが、うまく実行させることができません。ひとつひとつのフォルダリストをdirlistを使って
いるのですが、どうすればうまく実行させることができるでしょうか?
 ご教示お願いします。



この記事に返信する


KIMU

リンク

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
こんな感じじゃないですか?



KIMU

リンク

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でやると問題ないみたい



As

リンク

2007/3/5(Mon) 21:52:49|NO.6058

KIMUさん、うひょさん、ありがとうございますペコm(_ _;m)

KIMUさんの方法を試してみたしたが、3階層までしか取得することができませんでした><
うひょさんの方法では、どこまでも階層を取得できるようになっているのでうひょさんのスクリプトを
使わせていただきます<(_ _)>
ご教示ありがとうございました。



As

リンク

2007/3/5(Mon) 22:05:46|NO.6059

#解決したとおもったのですが、うひょさんのスクリプトも2階層までの取得でしたね(´;ェ;` )



kz3

リンク

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階層までしか取得することができませんでした><
明らかに三階層ではないと思います。
カレントディレクトリ内のフォルダ一階層のみしか調べていないコードだからですよ。



kz3

リンク

2007/3/6(Tue) 01:11:00|NO.6066

>KIMUさんの方法を試してみたしたが、3階層までしか取得することができませんでした><

KIMUさん的には
>こう言う事じゃ無くて?
>dirlist dirf,dirtmp+"\\*.*",1
こっちを見てもらいたかった気がします。



kz3

リンク

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



KIMU

リンク

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 の使い方が意味なかったので、そのへんを修正)



KIMU

リンク

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

#一度削除して再掲載しました。
#修正が足りない所と処理順がおかしくなる所があったので
#修正箇所だけでなく全て載せました。



As

リンク

2007/3/8(Thu) 19:10:33|NO.6151

kz3さんKIMUさんありがとうございます。
こういったプログラムは頭がこんがらがってしまい、ソースをみても動作することはわかっても
どんな動きなのか理解することはできませんでしたが^^;
参考にさせていただきます。



ONION software Copyright 1997-2023(c) All rights reserved.