XREA.COM Logo XREA.COM Ad

管理人の雑記

10管理人 ★:06/06/14 08:03 ID:???
ランチャーの奴にアーカイブファイル内のファイルを色々する機能を追加
http://lukewarm.s101.xrea.com/myscripts/FileLaunch.zip

アクティブウィンドウから自動登録する機能をつけてからは、かなり使うようになった。
適当に作った機能の割に役に立っている。
スキャンとかフォルダ展開とかコマンド機構とかMigemoとかは要らなかったんじゃないか。

それはそうと、この間作った統合アーカイバプロジェクトの奴でアーカイブファイルをフォルダとして扱えるようにすることに。

FindFirst/FindNextでは全ての階層のファイルが一遍に取得されるというので、除外フォルダ正規表現やスキャンフォルダ深度の設定は無視することに。
元々、スキャンするフォルダを減らしてスキャンにかかる時間を減らすための機能であるが、階層が無視されるFindFirst/FindNextに無理に適用しようとすると、逆に処理が増えて本末転倒なのである。

フォルダ展開モードでもアーカイブファイルを展開できるように。
ここでは、通常のフォルダと同じようにフォルダ直下のファイルだけを表示するようにしたい。
ArcFind(parent . "*")のようにして指定フォルダ以下のフォルダを列挙し、parentと同じ文字数だけStringTrimLeftし、途中に「\」を含むパス(サブフォルダ内のファイル)を除外すれば、フォルダ直下のファイルが列挙されるはずである。
しかし、FindFirst/FindNextではフォルダが列挙されない場合がある。ファイル形式によるのかファイルの作られ方によるのか、必ずそうなるのかはよく分からんが。
そこで、「\」を含むファイルは最初の「\」までをStringLeftで切り出して列挙しておき、最後にSort,,Uで重複を除外することで、フォルダ直下のファイル・フォルダ名を列挙できるようにした。
FindFirst/FindNextが名前順になっていないことがあるため、元々Sortは必要だった。

とりあえず実行したら、なぜかフォルダ展開モードでファイル名の先頭が削れる。
アーカイブファイル内のパスを「〜\arc.zip|\path\fn.ext」のように表現していて、ArcFind()には「\path\*」のようにして渡していたのだが、GetNameで取得されるパスは「path\fn.ext」のようになっていて、「\path\」と同じ文字数だけ削ると削りすぎてしまうせいだ。
確かに、ルートフォルダからの相対パスなのだから、先頭に「\」が付かない方が正しいような気がするのだが、FindFirstで「\」で始まるパターンにマッチするのは謎だ。
階層の区切りを「\」にしておかないと、上位階層のパスを求めるときなどに面倒なので、検索するときに「\」を切り捨てるようにして解決した。

アーカイブファイル内のファイルを実行するときは、一時フォルダに解凍して実行するようにしたい。
リムーバブルメディアの仮想パスだったら実際のファイルのパスに変換するという部分に、アーカイブファイル内のファイルなら解凍して解凍されたファイルのパスに変換するという動作を追加して実現した。

ついでに、リムーバブルメディアが挿入されていなかったら挿入するように促すダイアログを表示するという機能をつけた。

このGetRealPathという関数は、あちこちから呼ばれているため、どんなときに使っているのか分からなくて困る。
ファイルを開くわけでもないのにメディアを挿入しろと言われたり解凍が行われたりすると鬱陶しいので、関数の引数を追加して、ファイルが実在している必要があるところから呼ぶときだけこれらの機能が有効になるようにした。

そんなわけで、どうでもいい機能が増えた。使う人なんているのだろうか……?
101KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08