More ... | 編集履歴:過去のバージョン2015/09/09 10:05:01 JST時点でのdirlistにてサブディレクトリも取得できればいいなの内容* 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 }}} [https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/dirlistk.txt ダウンロード先(外部リンク)] |