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

編集履歴:差分

2015/09/09 09:53:50 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のシステム側に任せてあります
- 	//遅いです
  
+ * dirlistにてサブディレクトリも取得できればいいなとは
  
+ サブディレクトリの中身を含めたディレクトリ一覧を取得するためのモジュールです。~%
+ メモリ確保を完全にHSP3の動的確保に任せているので、dirlist2より遅く、また機能は少ないという欠点があります。
- 	#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//一時ファイル
  
+ http://nopswebpages.webcrow.jp/apps/
- 	//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 ダウンロード先(外部リンク)]