myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

Delete Redundant Folders v.Beta

圧縮されたファイルを解凍する時に、普通はフォルダに解凍しますね。

でもそのファイルに同じ名前のフォルダが含まれていたら、フォルダの中にまた同じ名前のフォルダが作られてしまいます。

要するに: c:\folder\folder\naiyou  みたいなことになっちゃいます。

これを防ぐために、解凍ソフトにこういうオプションがあったりします:

redundant.gif

これで解凍する時に圧縮ファイルと同じ名前のフォルダが作られません。

なのでさっきの例文でいうと、 c:\folder\naiyou で解凍してくれます。folderが圧縮ファイルに入っていたとしても。

しかし、皆がこのツールとこのオプションを使っているわけではありません。
ウィンドウズのデフォルトZIPしか使ってない人も意外と多い orz

もう既に誰かが下手に解凍しちゃって、ダブってるフォルダが多い時に手動で直すしかないですね。面倒くさいけど。
もちろん毎回、フォルダの中のフォルダの中のフォルダにアクセスするのは嫌です。そんな効率悪いデータ管理は許せませぬ!でも手動で直すのも面倒だし・・・。

VBSでなんとかならんのかなと思い、挑戦してみました。昨日は仕事がちょっと暇だったし。

まだ色々解決してないまま、無理やりなところもあるけど一応β版的なスクリプトが出来ました。


スクリプト内容

親と同名の子供は偽名で親が居るところに忍び込んで暗殺し、親の名や土地を奪う。というテーマでございます。

・フォルダ(親)のサブフォルダ(子)を確認する。フォルダ数が1つ(一人っ子)、そしてファイルが入っていない場合:次に
・サブフォルダ(子)はフォルダ(親)と同名の場合、サブフォルダ(子)の名前を変えて、親フォルダの親(祖父)の子にします。
※ フォルダ(親)にファイルもあった場合(サブフォルダ(子)と同じレベル)、これも親フォルダの親の下に移動されます。
・フォルダ(親)を消して、元サブフォルダ(子)をリネーム。

念のために、移動・リネームされる前にYES/CANCELというダイアログウィンドウが出てきます。
やっぱや~めた。という時もあるかもしれないからね。
※ 一応「askquestion」という変数でこのダイアログウィンドウをON/OFFに切り替えることが出来ます。

DOWNLOAD

注意:

移動コマンドは1段階だけにしました。なので
・folder0\folder1\folder1\folder1  の場合は
・folder0\folder1\folder1  になるので、
・folder0\folder1 にしたい場合はもう一回かける必要があります。

完成版:
http://myara.blog.fc2.com/blog-entry-41.html




PART 2

ここからはスクリプティング的な話になります。

Windowsのフォルダ管理のVBS作成あまり経験がないので良く分からないですけど、面倒くさいんですよ!

自分の勉強不足という問題だけかもしれませんけど。

オブジェクトコレクションが作れません。辞書か、フォルダーコレクションでやるしかないです。
フォルダコレクションが更新しないからフォルダの名前を変えると、その子と親が認識されません[INVALID]というエラーが出てきます。
FSOコマンドでやったこともフォルダコレクションに更新されません。

面倒くさいことばっかりで思った以上に時間が掛かってしまいました。

「A」フォルダを消して、同じところにある「B]フォルダを「A」にリネームしようとしたら、

「既に同名のファイルが存在しています。」

とかのエラーが出ます。
いや、さっき消したんだから!

じゃあ、「A」という新しいフォルダ作成(FSO.CreateFolder):

「既に同名のファイルが存在しています。」

うぜーーー

ないっつーの。どこにあるっていうんだよ・・・。

じゃあ、これでどうかな。

「フォルダが存在しない場合」という条件を作って(if not FSO.FolderExists)存在しない場合:フォルダ作成。 でやってみると:

「既に同名のファイルが存在しています。」

マジかよ・・・。

じゃあFSO.FolderExists がちゃんと感知してるってことは、同じFSOコマンド:FSO.Moveでいけるかな。
FSO.Moveでリネームしてみよっと

「既に同名のファイルが存在しています。」

なんなんだよーゲイツさん!もうわけ分からん。

FSO.FolderExists がちゃんと存在してないことが分かってるのに、CreateやRenameが馬鹿で気づかないんですね。いつまでも過去に縛られてんじゃねぇ!現実を見ろ!「A」フォルダはもう死んだんだ!とでも言ってやりたいな。

気持ちの切り替えに時間が必要かな。

試しに、ループ毎回サブフォルダーの数(SubFolders.Count)をmsgboxで出るようにしたら、やっぱりフォルダを消した後でもカウントされてしまいます。しかし、for loop でそのサブフォルダの名前をmsgbox出したら、消されたフォルダが出てきません。

存在してないんだから!!

あきらめて、リネームコマンドを別のサブルティーンにしました。

ループが増えるから嫌だったけど仕方ない。僕の知識じゃあ、こうするしかない。

これでちゃんと動きますが、なんかかっこわりぃ。

誰か教えて下さい。