More ... | 編集履歴:差分2015/10/26 18:18:17 JST以来のdirlistにてサブディレクトリも取得できればいいなの変更箇所
+ - →[[Module:Textproc]]に戻る - * dirlistにてサブディレクトリも取得 + ---- - {{{ - #module - //サブディレクトリも取得できるdirlistのようなもの - //dirlistkai p1,p2,p3 - //p1=変数名 : リストを格納する文字列型変数 - //p2=文字列 : dirlistのファイルマスクと同じ - //p3=0~7(0) : dirlistのディレクトリ取得モードと同じ - //実行後statにフォルダの中に存在する数を返します(dirlistと同じ)(取得中にエラーが発生したら多分-1が返ります) - - //dirlistでサブディレクトリも取得できたらいいなと思い作りました - //後でdirlist2の存在の存在に気がつきましたがこちらのほうがDLLを使わず機能は単純で使いやすいと思います - //dirlstでのメモリ確保は完全にHSPのシステム側に任せてあります - //遅いです - - - #define MAX_PATH 260 - #define CR 13 - #define LF 10 - #define INVALID_HANDLE_VALUE $FFFFFFFF - - //ファイル属性 - #define FILE_ATTRIBUTE_READONLY $00000001//読み込みのみ - #define FILE_ATTRIBUTE_HIDDEN $00000002//隠しファイル - #define FILE_ATTRIBUTE_SYSTEM $00000004//システムファイル - #define FILE_ATTRIBUTE_DIRECTORY $00000010//フォルダ - #define FILE_ATTRIBUTE_ARCHIVE $00000020//アーカイブ - #define FILE_ATTRIBUTE_ENCRYPTED $00000040//暗号化されている - #define FILE_ATTRIBUTE_NORMAL $00000080//属性なし - #define FILE_ATTRIBUTE_TEMPORARY $00000100//一時ファイル - - //WIN32_FIND_DATA構造体 - #define dwFileAttributes 0 - #define ftCreateTime 4 - #define ftLastAccessTime 12 - #define ftLastWriteTime 20 - #define nFileSizeHigh 28 - #define nFileSizeLow 32 - #define dwReserved0 36 - #define dwReserved1 40 - #define cFileName 44//ファイル名(NULLつき) - #define cAlternateFileName 304//8.3形式(すごく昔のファイル名の形式: ファイル名本体が8文字 拡張子が3文字だけ)のファイル名(NULLつき) - #define WIN32_FIND_DATASIZE 320 - - #uselib "kernel32.dll" - #func FindFirstFile "FindFirstFileA" var, var//ファイル情報の取得に使う - #func FindClose "FindClose" int - - #deffunc dirlistkai var p1, str p2, int p3, local i, local j, local k, local forudagoukei, local folders, local buf, local foldernum, local folderp, local atonagasa, local dircurbak, local relatpath, local dircurnum, local relatpathnum , local filegoukei, local winfind , local bbuf, local ifflag, local filegetflag - dim i:dim j:dim k - dim forudagoukei//フォルダの合計 - sdim folders,,MAX_PATH//各フォルダの一覧 - sdim buf,MAX_PATH - sdim bbuf,MAX_PATH - dim foldernum,MAX_PATH//各フォルダの一覧の長さ - dim folderp,MAX_PATH//今何番目のフォルダか - dim atonagasa - sdim dircurbak,MAX_PATH - sdim relatpath,MAX_PATH - dim dircurnum - dim relatpathnum - dim filegoukei//フォルダ以外のファイルの合計 - sdim winfind,WIN32_FIND_DATASIZE//WIN32_FIND_DATA構造体 - dim ifflag//if文で分けるときに使う - dim filegetflag,MAX_PATH//ファイルを二重にカウントするのを防止 - dircurbak=dir_cur - dircurnum=strlen(dircurbak) - relatpath=dir_cur - repeat - if j!=1{ - relatpath=dir_cur - - relatpathnum=strlen(relatpath) - - memcpy buf,relatpath,relatpathnum-dircurnum-1,,dircurnum+1 - relatpathnum-=(dircurnum+1) - if relatpathnum<=0:relatpathnum=0 - memcpy relatpath,buf,relatpathnum - - poke relatpath,relatpathnum,0 - dirlist folders.i,p2,5 - foldernum.i=strlen(folders.i) - - if p3==5 | p3==0 | p3==2 | p3==6 | p3==7{//フォルダの一覧取得 - - j=0 - k=0 - repeat// foldernum.i - if peek(folders.i,j)==0:break - if peek(folders.i,j)==CR{ - poke bbuf,j-k,0 - memcpy bbuf,folders.i,j-k,,k - memset winfind,0,WIN32_FIND_DATASIZE - FindFirstFile bbuf,winfind - if stat!=INVALID_HANDLE_VALUE{ - FindClose stat - ifflag=0 - if p3==2{ - if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_HIDDEN{ - }else{ - if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_SYSTEM{ - }else{ - ifflag=1 - } - } - } - if p3==6{ - if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_HIDDEN : ifflag=1 - if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_SYSTEM : ifflag=1 - } - if (p3==5 | p3==0 | p3==7) : ifflag=1 - if ifflag{ - if peek(p1,0)!=0{ - atonagasa+=2 - memexpand p1,atonagasa+1 - poke p1,atonagasa-2,"\n" - } - if i>0{ - memexpand p1,atonagasa+(j-k)+relatpathnum+1+1 - memcpy p1,folders.i,j-k,atonagasa+relatpathnum+1,k - poke p1,atonagasa+relatpathnum,'\\' - memcpy p1,relatpath,relatpathnum,atonagasa - poke p1,atonagasa+(j-k)+relatpathnum+1,0 - atonagasa+=((j-k)+relatpathnum+1) - }else{ - memexpand p1,atonagasa+(j-k)+1 - memcpy p1,folders.i,j-k,atonagasa,k - poke p1,atonagasa+(j-k),0 - atonagasa+=(j-k) - } - }else{ - forudagoukei-- - } - }else{ - forudagoukei=-1 - break - } - k=j+2 - j++ - } - j++ - loop - if forudagoukei==-1{ - forudagoukei=0 - filegoukei=0 - break - } - - } - - - //dialog dir_cur,2:if stat=7:end - forudagoukei++ - } - - if filegetflag.i==0 & (p3==0 | p3==1 | p3==2 | p3==3 | p3==6 | p3==7){//ファイルの一覧取得 - dirlist buf,p2,1 - filegoukei+=stat - j=0 - k=0 - repeat// foldernum.i - if peek(buf,j)==0:break - if peek(buf,j)==CR{ - poke bbuf,j-k,0 - memcpy bbuf,buf,j-k,,k - memset winfind,0,WIN32_FIND_DATASIZE - FindFirstFile bbuf,winfind - if stat!=INVALID_HANDLE_VALUE{ - FindClose stat - ifflag=0 - if (p3==1 | p3==0) : ifflag=1 - if p3==2 | p3==3{ - if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_HIDDEN{ - }else{ - if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_SYSTEM{ - }else{ - ifflag=1 - } - } - } - if p3==6 | p3==7{ - if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_HIDDEN : ifflag=1 - if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_SYSTEM : ifflag=1 - } - if ifflag{ - if peek(p1,0)!=0{ - atonagasa+=2 - memexpand p1,atonagasa+1 - poke p1,atonagasa-2,"\n" - } - if i>0{ - memexpand p1,atonagasa+(j-k)+relatpathnum+1+1 - memcpy p1,buf,j-k,atonagasa+relatpathnum+1,k - poke p1,atonagasa+relatpathnum,'\\' - memcpy p1,relatpath,relatpathnum,atonagasa - poke p1,atonagasa+(j-k)+relatpathnum+1,0 - atonagasa+=((j-k)+relatpathnum+1) - }else{ - memexpand p1,atonagasa+(j-k)+1 - memcpy p1,buf,j-k,atonagasa,k - poke p1,atonagasa+(j-k),0 - atonagasa+=(j-k) - } - }else{ - filegoukei-- - } - }else{ - forudagoukei=-1 - break - } - k=j+2 - j++ - } - j++ - loop - filegetflag.i=1 - if forudagoukei==-1{ - forudagoukei=0 - filegoukei=0 - break - } - - } - - - j=0 - - if folderp.i>=foldernum.i{//フォルダの一覧を最後まで処理したまたはフォルダが一つもない - folderp.i=0 - filegetflag.i=0 - if i==0:break - i-- - j=1 - buf=getpath(dir_cur,32) - poke buf,strlen(buf)-1,0 - memset winfind,0,WIN32_FIND_DATASIZE - FindFirstFile buf,winfind - if stat!=INVALID_HANDLE_VALUE{ - FindClose stat - if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_DIRECTORY{ - chdir buf - continue - } - } - forudagoukei=0 - filegoukei=0 - break - } - j=folderp.i - - repeat - if peek(folders.i,j)==0:break - if peek(folders.i,j)==CR:break - j++ - loop - j-=folderp.i - memcpy buf,folders.i,j,,folderp.i - poke buf,j,0 - folderp.i+=j - if peek(folders.i,folderp.i)==CR:folderp.i+=2 - j=0 - - chdir buf - i++ - folderp.i=0 - loop - chdir dircurbak//カレントディクトリをもとに戻す - //title ""+atonagasa - if p3==1 | p3==3 : forudagoukei=1 - return (forudagoukei-1)+filegoukei - - #global - }}} + * dirlistにてサブディレクトリも取得できればいいなとは + + サブディレクトリの中身を含めたディレクトリ一覧を取得するためのモジュールです。~% + メモリ確保を完全にHSP3の動的確保に任せているので、dirlist2より遅く、また機能は少ないという欠点があります。 + + * 配布元 + + http://nopswebpages.webcrow.jp/apps/ + + * 既知の問題 + + 遅いです。 - [https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/dirlistk.txt ダウンロード先(外部リンク)] |