[トップ][一覧][最近の更新]

編集履歴:過去のバージョン

2015/10/26 18:18:17 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 ダウンロード先(外部リンク)]