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

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

2015/09/09 09:53:15 JST時点での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 ダウンロード先(外部リンク)]