再帰(?)プログラミング

再帰プログラミング」って、テキストデータの入出力を終えたプログラミング1年生なら必ずやるネタだったような気がする。というわけで、ちょっとやってみた。後述するが、実はこれ、完成形ではない。


Imports System
Imports System.IO

Module hoge
Sub Main(ByVal cmdArgs() As String)
Dim strArgs As String
Dim usage As String = "xxx.exe

" Dim str2 As String = "*" If cmdArgs.Length = 0 Or cmdArgs.Length > 2 Then Console.WriteLine(usage) ElseIf cmdArgs.Length = 1 Then dirSearch(cmdArgs(0), str2) ElseIf cmdArgs.Length = 2 Then dirSearch(cmdArgs(0), cmdArgs(1)) End If End Sub Function dirSearch(ByVal strDir As String, ByVal strFileType As String) As Integer Dim directory As String Dim file As String If strFileType = "" Then strFileType = "*.*" Else strFileType = "*." + strFileType End If Try For Each directory In System.IO.Directory.GetDirectories(strDir) For Each file In System.IO.Directory.GetFiles(directory, strFileType) Console.WriteLine(file) Next dirSearch(directory, strFileType) Next Catch excpt As System.Exception Console.WriteLine(excpt.Message) End Try return 0 End Function End Module
うーん、恐ろしく汚いコードだなあ。
引数は二つで「ディレクトリ」と「ファイルタイプ」。二つとも省略するとUSAGEが表示され、「ディレクトリ」だけだと、すべてのファイルを、「ファイルタイプ」もあわせると、ディレクトリ内の指定したファイルタイプに合致するファイルを表示する。
まあ、当たり前といえば当たり前なんだけれど、当たり前じゃない点がいくつか。

  1. Importsが効かない
  2. C:\以下は確実に拾ってくるが、拾ってこないディレクトリがある

まだあったんだけど、とりあえず。
1はおそらく私がヘタレなせいでどこか間違えている可能性が高い。でもなあ、「System.IO」をキチンとImportしているにもかかわらず、「System.IO.Directory.GetDirectories(strDir)」と宣言しなければならないんだよなあ。
# あー、コンパイルするときにライブラリを指定し忘れているかもー。
で、2のほうは、よくわからん。これ知っている人がいたらこっそり教えてください。
具体的に説明すると、


C:\usr\VB\Recurs>dir "c:\Program Files\MagicISO"
ドライブ C のボリューム ラベルは Solaris9 です
ボリューム シリアル番号は BCDD-9B59 です

c:\Program Files\MagicISO のディレクト

2003/10/09 12:27

. 2003/10/09 12:27 .. 2003/05/22 10:58 2,550 cdburner.ico 2003/10/09 12:27 2,160 INSTALL.LOG 2003/05/26 10:19 455,198 MagicISO.chm 2003/07/16 23:22 708,096 MagicISO.exe 2001/05/10 10:04 162,304 UNWISE.EXE 5 個のファイル 1,330,308 バイト 2 個のディレクトリ 16,905,707,520 バイトの空き領域 C:\usr\VB\Recurs>vbrecurs.exe "c:\Program Files\MagicISO" exe C:\usr\VB\Recurs>

となるのよね。
♪なんでだろーなんでだろぉ〜