VisualBasic Programing Tips

フォルダー内全削除(ファイルツリーの作成を含む)サンプルプログラム
 最近、再び Visual Basicを引っ張り出してきて、プログラムをいじくっている。世の中の趨勢(MSの誘導)は既に.NET に移行しているが、年数回しか引っ張り出さない私はまだ元が取れていないので VB6.0のまま。何を作っているかはまだ明かしたくないが、その中である程度汎用性のある処理を作ったので、メモ代わりに残すことにした。
 私もこんなものを自作するのは面倒くさいので、どこかにあるだろうとWebを幾つかのキーワードで検索したが、どこかのサポート掲示板で、「教えて」という書込みは見たがどうすればいいのかのコメントはなかったので仕方なく自作してみました。何とか動くようになったので公開します。
 作っている課程で、別の方法の法がスマートに見えてきたので似た方法でもう一つ作った。どちらも多分、大体動く。
但し、いつものことだが、これが不具合を惹起しても私は責任をとれません。再帰的な削除処理というのは、ほんの僅かの間違いで非常に深刻な事態を招くこともあり得ます。引用やテストはくれぐれも注意してください。
機能
 ★ 指定したフォルダー以下の全子フォルダーとその中の全ファイルを削除します。
で、その中では当然、ファイルとフォルダーを検索してファイルツリーを作っていますので、おまけにファイルツリーをファイルに書き出すような機能も入れてありますが、このまま実行するとファイルツリーを書き出したファイル(fTree.txtが削除対象のフォルダ(C:\Temp\A)に作られるので、これも削除されてしまう。もし残したければ別のフォルダに作るように変更が必要。

概要
 操作としては、 「Do」ボタンを押すと、まずテキストボックスで指定されたフォルダー以下のファイルツリーを作って、FTree.txt というファイルに書き出します。
 次に、全フォルダ/ファイルが削除されますと言う警告を出した後、全てのフォルダ/ファイルを削除します。
Windowsの機能としては、フォルダを選択して Delボタンを押すか ファイル → 削除 と操作すれば良いだけの話で、何と言うことはありませんが、VBでは ファイル削除は Killステートメント、フォルダの削除はrmDirステートメントと分かれており、rmDirステートメントでは内部にファイル/フォルダが存在すると削除できないのでこれをプログラムとしてどう組むかというのが問題です。
方法1:
 ファイルツリーを作成するサンプルは幾つか見たことがあるので、これを利用してその中にファイルの削除と、空になったフォルダーの削除を組み入れましたが、ポイントは一番下位のフォルダーを削除した後、再帰的にその親フォルダーを遡って削除していくことです。つまり、下位フォルダに向かって行くときにファイルを削除して、上位フォルダに向かって戻っていくときにフォルダを削除していくようにしてあります。子フォルダーが2つあるような場合、片方の子フォルダーを削除してももう片方の子フォルダーが残っているのでそのフォルダーを再度 最下位まで下ってから順次上位のフォルダーを削除するようになっています。
フローチャート
コーディング例
方法2:
 方法1を作ってみて、全体としては問題ないんですが、フォルダとファイルが別々に削除されるというのがちょっと気に入らなかったので、なるべくフォルダとその直下のファイルを同時に削除する方法も考えました。
 具体的には、下位に向かうときはファイルとフォルダのリストアップだけを行い、最下位フォルダ(それより下位にフォルダがない)に達したら、そこで初めてファイルの削除を行い、自身のフォルダも削除するというものです。再帰的な処理をしているので、自身のフォルダを削除したら、元に戻るのですがそこで同じ階層の別のフォルダがあれば、そこで再び下位に向かってリストアップ、最下位に達したら再び上位に向かってファイルとフォルダの削除を行うようになっています。
フローチャート
コーディング
 実行するには右図のように Form にテキストボックスとコマンドボタンを配置し、方法1か 方法2のコーディングを Formに貼付けます。



FTree.gif で、わざわざこんな複雑なファイルツリーを作ってから実行し、ファイルツリーを作成するとこうなります。 それが全て綺麗に削除できるのを確認しました。
尚、コーディング中にはファイル拡張子による制限やファイル作成日付による制限条件が加えられるようになっています。若干のコメントがあるのでそれを手がかりにすると機能を付加できると思います。



動作確認環境: O/S Windows2000、 Visual Basic 6.0


NAME.gif Ftop button.gif  総アクセス数