1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
| #module
#uselib "kernel32.dll"
#func MoveFile "MoveFileA" sptr,sptr
//大量のディレクトリまたはファイルを連番フォルダに指定した数だけ移動
//dirpass ディレクトリパス
//num 移動させる数
//equalize 1を指定すると、ひとつの連番フォルダにファイルとフォルダを均等に移動します。
// 0の場合はフォルダの移動を優先します
// また、処理速度の観点から既にフォルダに入っているファイルとフォルダの比率は考慮されず、
// 移動可能ファイルフォルダ数が均等値より満たない場合はフォルダが優先的に移動されます。
// その場合は、フォルダのみの連番フォルダになる場合があります。
#deffunc RefreshDirectory str dirpass, int num, int equalize
if num=0:dialog "num値が0です",1,"Error:RefreshDirectory":return
vdirpass=dirpass
if strmid(vdirpass, -1, 1)="\\" : vdirpass=strmid(vdirpass, 0, strlen(vdirpass)-1) //最後の行に”\”がある場合、はずす
if vdirpass=dir_win : dialog "システムフォルダには使用できません",1,"Error:RefreshDirectory":return
if vdirpass=dir_win+"\\system" : dialog "システムフォルダには使用できません",1,"Error:RefreshDirectory":return
if vdirpass=dir_win+"\\system32" : dialog "システムフォルダには使用できません",1,"Error:RefreshDirectory":return
chdir vdirpass //カレントディレクトリを移動
dirlist filelist,"*.*",1 //ディレクトリにあるファイルリストを取得
filenum=stat //ファイルの数
dirlist folderlist,"*.*",5 //ディレクトリにあるフォルダリスト
foldernum=stat //フォルダの数
if equalize=1{
if num\2=1:rest=1:else:rest=0 //あまり
equality=num/2+rest //割り切れない場合、繰り上げる。(フォルダ:ファイル =6:4 の割合になります)
}
repeat
movedir=""
fnum=0
//総当りで連番フォルダがあるかどうかを調べる
notesel folderlist //フォルダーリスト
repeat foldernum,1 //連番フォルダは1から開始される
fcnt=str(cnt)
repeat foldernum
noteget temp,cnt //フォルダ名を取得
if temp=fcnt { //連番フォルダが発見された
fnum=temp //発見された連番フォルダの番号を保持する
dirlist sflist,fnum+"\\*.*" //中身
sfnum=stat //中身のファイルとフォルダ数
if sfnum<num{ //中身のファイルの数がnumより少ない
movedir=temp //現在の連番フォルダを移動ディレクトリに設定
break
}
}
loop
if movedir!"":break //movedirが設定されたらbreak
loop
if int(movedir)=filenum+foldernum : break //設定された移動ディレクトリがファイルとフォルダの数と同じ数なら、
//ひとつも移動させるファイルやフォルダがないと見なし、breakする
if movedir=""{ //ひとつもファイルやフォルダを入れることができるフォルダが見つからなかった
mkdir str(int(fnum)+1) //最後見つかった連番フォルダの次の値のフォルダを作成する。連番フォルダが無かった場合は1から開始する。
movedir=str(int(fnum)+1) //movedirに新たに作成したフォルダを設定
noteadd str(int(fnum)+1) //フォルダが作成されたので追加する
foldernum+ //フォルダが作成されたので数を増やす
movecountdown=num //移動可能数は制限されない
}else{
//移動フォルダが設定された
movecountdown=num-sfnum //移動可能な残り回数
}
if movecountdown<=0:dialog ""+movedir+" 現在の移動先フォルダの移動可能ファイル数は0以下です",1,"Error:RefreshDirectory":break
notesel folderlist
if foldernum!0{ //フォルダの数が0の場合実行しない
if equalize=1{
equalitycount=0 //均等カウント
}
repeat //移動してもよい数だけフォルダを移動する
noteget temp,cnt //フォルダの名前を取得
//連番フォルダかどうか調べる
rflag=0
repeat int(movedir),1 //現在存在している連番フォルダまでの1〜movedirまで繰り返す
if temp=str(cnt){
rflag=1 //連番フォルダだった場合、この連番フォルダを移動させないためのフラグを立てる
break
}
loop
if rflag=0{ //連番フォルダではない
MoveFile dir_cur+"\\"+temp+"\\",dir_cur+"\\"+movedir+"\\"+temp+"\\" //フォルダ移動
notedel cnt //移動したのでリストから除外
foldernum- //ルートのフォルダ数を1減らす
movecountdown- //移動可能な数を1減らす
if equalize=1{
equalitycount+ //均等
}
}
if movecountdown=0{ //全部移動しおわった
break //break
}
if foldernum=int(movedir){ //ルートにあるフォルダが連番フォルダだけになった
break
}
if equalize=1{
if equalitycount=equality{ //フォルダを移動できる均等を満たした
break
}
}
if rflag=0{
continue cnt //同じループを繰り返す
}
loop
}
if movecountdown!0{
notesel filelist
repeat movecountdown //移動可能な分だけ移動する
noteget temp //ファイル名を取得
MoveFile dir_cur+"\\"+temp,dir_cur+"\\"+movedir+"\\"+temp //ファイル移動
filenum- //ファイルが一つ移動したので数を1減らす
notedel //ファイルリストから現在のファイルを除外
if filenum = 0{ //最後のファイルがなくなった
break
}
loop
}
if int(movedir)=filenum+foldernum : break //設定された移動ディレクトリがファイルとフォルダの数と同じ数なら、
//ひとつも移動させるファイルやフォルダがないと見なし、breakする
loop
return
#global
#if 0
RefreshDirectory "",10,1
mes "完了"
stop
#endif
|