[三流君] −−> [プログラマー業務の愚痴] −−> [バックナンバー一覧]
−−> No.041 VB5 Setup.exe を探し一覧表示する

VB5 Setup.exe を探し一覧表示する


本文(発行内容)


<VB5 Setup.exe を探し一覧表示する>

目次
1.はじめの挨拶
2.環境があればできるんだけど、、、ホントかよ
3.作ってみたが、なんかシックリこない、、、
4.またまた増える今後の課題?
5.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.はじめの挨拶
*/
こんにちは。

今回は、出向先の同僚に依頼された処理を元に
こんなの自分で作れ、、なんてグチを含めた
芸術的なプログラムが書けない、Ken3の独り言です。
お時間のある人は、お付き合いください。

では、またいつもの手抜き調理、聞いてください。

/*
 * 2.環境があればできるんだけど、、、ホントかよ
*/
下記のような依頼メールを出向先の同僚からいただきました。
---------------
現在CD-ROMに焼いて各支店に配っているAccessで作ったシステムが
あるのですが、毎月セットアップをしなくてはならないため、CD-ROM
挿入後自動でセットアッププログラムを起動させたいのですが、

以下のようなディレクトリ構成でそれぞれにセットアッププログラム
があり、それらを選択するプログラムを必要です。

■Pattern A
 CD-ROM
  +SLS
    +事業部名
      +Tokyo
      +Osaka
      +Nagoya
        : 
■Pattern B
 CD-ROM
  +SLS24
    +事業部名
      +Tokyo
      +Osaka
      +Nagoya
        : 
 ※事業部名はそれぞれのCD-ROMによって異なる。

サブディレクトリを読み取って、ユーザーにセットアップを選択させる
プログラムの開発をお願いします。
本来であれば、私が作成すればいいのでしょうが、こちらにVBやVCと
いった環境がないものですから.....
---------------

各ディレクトリに入っている
Setup.exeの起動プログラムねぇ、、、
エクスプローラで起動する丁寧なマニュアルを配布先に渡したほうが
いいような気がするけど、、、(また、始まったよ、やりたくない病?)

さらにグチ続く、、
VBやVCといった環境がない?
じゃ、環境があれば作れるのかよ、、
ノートパソコン送ってあげようか?
(なんて、言えるはずの無いことをメルマガでグチらせてもらって)

まぁ、依頼のしかたの最後が少しカチンと来たけど、
作成してみようと思います。
*私も後輩に作業を頼む時は、気をつけないと、、、
 (自分へ一言、、テメエみたいな変な後輩いないから大丈夫でしょ
          あっ、そっか。。。)

後輩への悪い頼み方:「自分でやればできるんだけど、やってくれる」
後輩の心の中?  :「ホントに自分でできるのかよ、できないくせに、、」







/*
 * 3.作ってみたが、なんかシックリこない、、、
*/

やっと、ここから、ソースが出てきます
(マジメな読者の方、、お待たせしました)
下記、私が、グチりながら作ったサンプルです。
作ってみたが、なんかシックリこないのですが。
*サンプル下記に保存しました。 あわせて見てください。
( hosoku/041/index.html 参照 )

'-----
'VB5でフォームを1つ作りモジュール、、、に書いてみた、、
'リストボックスにSetup.exeの場所を表示して、
'選択後起動するサンプルです。
Private strDRV As String
Private strDirList(10000) As String
Private nDirCnt As Integer

Private Sub cmdEND_Click()
    Unload Me
    End
End Sub

Private Sub cmdRunSetup_Click()
    '念のため、実行確認
    If vbNo = MsgBox(Me.SetupList & "を実行します", vbYesNo) Then
        Exit Sub
    End If
    
    'Shell関数で起動
    Shell Me.SetupList, vbNormalFocus
    
    '自分自身を終了させる
    Unload Me
    End
    
End Sub

Private Sub Form_Activate()

    Dim n        As Integer
    Dim strFNAME As String

    If nDirCnt = 1 Then
        'ディレクトリの一覧を取得する(手抜き)
        Call searchDir(strDRV)
        'Setup.exe があるか、あらためて探す
        '(同時に探したほうが速いのにねぇ、、、)
        For n = 1 To nDirCnt
            strFNAME = strDirList(n) & "setup.exe"
            Me.Caption = strFNAME & "検索中"
            DoEvents
            If Dir(strFNAME) <> "" Then
                Me.SetupList.AddItem strFNAME
            End If
        Next n
        Me.Caption = "検索終了、、、"
    End If

End Sub

Private Sub Form_Load()
    
    '検索ドライブを自分のパスから判断
    strDRV = Left(App.Path, 1) & ":\"
    Me.labTitle.Caption = strDRV & "ドライブのSetup.exe 一覧"
    
    'カウンタの初期化
    nDirCnt = 1

End Sub

Private Sub searchDir(strSearchPath As String)

    Dim strWORK As String
    Dim strCHK  As String
    
    Dim nSTART  As Integer
    Dim nEND    As Integer
    
    Dim n       As Integer
    
    nSTART = nDirCnt   '格納開始位置を保存する
    
    'まず、受け取ったディレクトリから下のディレクトリを
    '変数に格納する
    
    If Right(strSearchPath, 1) <> "\" Then
        strSearchPath = strSearchPath & "\"
    End If
    
    strWORK = Dir(strSearchPath, vbDirectory)    ' 最初のフォルダ名を返します。
    Do While strWORK <> ""   ' ループを開始します。
        ' 現在のフォルダと親フォルダは無視します。
        If strWORK <> "." And strWORK <> ".." And strWORK <> "pagefile.sys" Then
            'チェックするファイル名を作成
            strCHK = strSearchPath & strWORK
            ' ビット単位の比較を行い、フォルダかどうかを調べます。
            If (GetAttr(strCHK) And vbDirectory) = vbDirectory Then
                ' フォルダであれば、それを変数にセットします。
                'ReDim strDirList(nDirCnt + 1) As String '配列の要素の数を増やします
                strDirList(nDirCnt) = strCHK
                Me.Caption = strCHK & "検索中"
                DoEvents
                nDirCnt = nDirCnt + 1
            End If
        End If
        strWORK = Dir                    ' 次のフォルダ名を返します。
        DoEvents
    Loop
    
    nEND = nDirCnt  '終了位置を保存する
    
    If nSTART = nEND Then  '1つも見つからなかった?
        '何もしない
    Else
        '今回新規にサーチしたディレクトリ数分その下を調べる
        For n = nSTART To nEND - 1
            Call searchDir(strDirList(n))
        Next n
    End If

End Sub
'-----
なってないなぁ、、、
芸術的な流れはこれだぞって指摘、待ってます。
ささいなことでも、気がついたことあったら送ってください。

/*
 * 4.またまた増える今後の課題?
*/
簡単な解説とダメ処理のまとめを書きます。

Form_Load()のイベントで、起動したドライブを取り出します。
'検索ドライブを自分のパスから判断
strDRV = Left(App.Path, 1) & ":\"
ポイントはApp.PathでVBで作成したExeの場所がわかると思う。
*自分へ文句  \\SRV1\CD\XXXX.EXE で、サーバーのCDから起動したら、
 どうなんだよ、、、

次に、Form_Activate()のイベントで、
ディレクトリをサーチし、Setup.exeを探し、
リストボックスへセットします。
Me.SetupList.AddItem strFNAME
..AddItemヘルプでみて下さい。

ディレクトリのサーチは、dir関数を使用し、
strWORK = Dir(strSearchPath, vbDirectory) 
で回しました。

あとは、目新しい処理しないで普通にやっていると思います。。

三流なんだねその1
 なんで固定の10000なの?
 Private strDirList(10000) As String
 一万件越えたらどうするつもりなんだよ、、メモリもムダにするし。
  'ReDim strDirList(nDirCnt + 1) As String '配列の要素の数を増やします
 はじめは、上記のように、
 ReDim を使用して、増やしながらやろうと書きましたが、
 再帰処理で再度関数を呼ぶとエラーになったので、
 手抜きでstrDirList(10000) As Stringにしました。
 (おいおい、頼むよ、、しっかりしてよ、、、)

三流なんだねその2
一流読者さんへ素朴な質問、
"c:\pagefile.sys"を
If (GetAttr(strCHK) And vbDirectory) = vbDirectory Then
で比較した時、実行時エラーで落ちたのですが、
なぜでしょうか?

/*
 * 5.終わりの挨拶
*/

今回のグチりながらのボロボロなプログラム作成、、どうでしたか?
なめてないで、流れをはじめに考えてから作らないと、
こんな汚いプログラム(動けばいいや的処理)になってしまいます。

えっ、三流のKen3らしい、、、
なんて声聞こえたところで、今日も逃げるように。。。

では、また。 三流PG Ken3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

リンクや広告など

項目別に本音?それとも建て前?的な記事をまとめました。

気になったジャンル↓を選択してください。
[ルーキー rookies]・・・ 新人さん達 初心者さんへ
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話
[共同作業 team]・・・チーム、グループ作業
[プログラムは心? spirit]・・・プログラマー 心・気質・魂

[掲示板デビューしようぜ bbs]・・・掲示板関係の話、質問者・回答者の気持ちほか
[昔はできた seo]・・・三流式の効果無しSEOとアフィリエイト
[仕事や作業、転職 job]・・・仕事や転職、評価、作業など
[その他 etc]・・・その他 分類外の記事

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]



[三流君(TOP ken3.org へ戻る)] / [プログラマー業務の愚痴] / [バックナンバー 一覧]