• ベストアンサー

実行画面が消えてしまう?

WindowsXP、VB6.0でデレクトリをTreeViewに表示するプログラムです。 フォームにTreeViewコントロールとコマンドボタンを貼り付け、 下記のプログラムを実行します。 curFolder.Name に "System Volume Information" がでると エラーになり、それを回避するために "On Error Resume Next"をいれて EXEファイルを作り、実行するとフォームが消えてしまいます。 どなたか教えて下さい。 Private Sub Command1_Click() ' Microsoft Scripting Runtime を参照設定する。 Dim item1 As Node, FsoObj As New scripting.FileSystemObject Set item1 = TreeView1.Nodes.Add(, , , "c:") Call SearchFolder(FsoObj.GetFolder("c:\"), item1) End Sub Private Sub SearchFolder(NextFolder As scripting.Folder,               itemX As Node) On Error Resume Next Dim TreeItem As Node, curFolder As scripting.Folder For Each curFolder In NextFolder.SubFolders ' Debug.Print curFolder.Path Set TreeItem = TreeView1.Nodes.Add(itemX.Index,                tvwChild, , curFolder.Name) Call SearchFolder(curFolder, TreeItem) Next End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • haporun
  • ベストアンサー率40% (230/562)
回答No.4

このフォルダにはインデックスサービスを利用してファイル検索を高速にするための情報が入っているようです。 しかし、この中身を勝手に参照されると困るようで、アクセス制御によってどんなファイルが入っているかはもちろん、このフォルダの作成日時なども見られないようになっています。 管理者は無理矢理このフォルダの内容を見ることができますが、やめたほうがいいでしょう。 よって、このフォルダの中身を参照しようとすると、VBの場合実行時エラーが発生します。 これは、おそらくFileSystemObjectを使っているのが原因で、このオブジェクトはフォルダ名を参照するだけでもそのフォルダの情報を取得しようとしている可能性があります。 API関数なら "参照できませんでした、はい残念" で済むのですが、VBコンポーネントの場合、外側でOn Error Resume Nextを指定しても中まで届かないことがあるみたいです。 API関数を使う方法を知っていますか? WIN32_FIND_DATA FindFirstFile FindNextFile FindClose これらのキーワードで検索してみてください。

noname#1504
質問者

お礼

回答有難う御座います。 TreeViewにすべてのフォルダを表示するには、フォルダの再帰検索を しなければなりませんが、Dir関数を使って無理やり再帰検索すると かなり面倒なプログラムになります。 このMicrosoft Scripting Runtimeを参照設定して、FileSystemObjectを 使うと嘘のように簡単になるので、「これはいい!」と 思ったのですが.....。 駄目なようですね。 そのAPI関数を使うか、あるいはVBでフォルダの再帰検索をすると かなり時間がかかるので、VC++でフォルダ再帰検索のActiveXを作って そのOCXを参照設定するか、これから検討してみます。 大変参考になりました。有難うございました。

その他の回答 (4)

  • haporun
  • ベストアンサー率40% (230/562)
回答No.5

VCでOCXを作る力があるくらいなら、VBからAPIでファイルリストを作ることも簡単でしょう。 >かなり時間がかかるので じつは、FileSystemObjectは、あまり効率のいい構造はしていないみたいです。 フォルダやファイル1つ1つが固有のオブジェクトになっているため、検索のたびにそれぞれがインスタンスを作るので、余計なメモリも消費されているようです。 FindFirstFileは作成時間や属性なども同時に取得してくれるので、エクスプローラの様なアプリケーションを作るために必要な情報は、一通りそろっています。 それでも、FileSystemObjectの10倍くらい速いみたいです(根拠なし)。 楽してインターフェースから作り始めるのもいいですが、内部からごりごり作っていくのもおもしろいですよ。 がんばってください。

noname#1504
質問者

補足

有難うございます。 >VCでOCXを作る.......。 などと表面だけ見ると、いかにも実力がありそうにみえますが実際は 参考書とのにらみ合いになるでしょう。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

if(curFolder.Path = "System Volume Information")then else end if

noname#1504
質問者

補足

>if(curFolder.Path = "System Volume Information")then >else >end if 回答有難うございます。 上記のサンプルを実行してみましたが、"For Each ....." の所で "書き込み出来ません"のエラーが出て駄目でした。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

>EXEファイルを実行した時に、多分エラーになるファイルをアクセスした時に >消えてしまうのではないかと思っています。 それなら、MsgBox curFolder.Pathを入れることにより、エラーになるファイル を含むフォルダを特定できるのでは?

noname#1504
質問者

補足

>それなら、MsgBox curFolder.Pathを入れることにより、 >エラーになるファイルを含むフォルダを特定できるのでは? 再度の回答、有難う御座います。 最初の質問に書きましたが "System Volume Information" をアクセスした 時にエラーになるようです。何かシステムに関係あるファイルのようで Cドライブにも、Dドライブにもあります。何故このフォルダ(?)を アクセスした時にエラーになるのか、あるいはこのフォルダ(?)を アクセスしないようにすれば、実行画面が消えないのでは....と 思いますがそれが分かりません。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

>' Debug.Print curFolder.Path MsgBox curFolder.Path にしてみては?

noname#1504
質問者

補足

>MsgBox curFolder.Path にしてみては? 早速の回答、有難うございます。 ' Debug.Print curFolder.Path はどんなファイルをアクセスした時に エラーになるのかを確認するためにいれてあります。実行ファイル作成時は コメントにしています。 VBのデバッグ環境では正常に動作しますが、EXEファイルを 実行した時に、多分エラーになるファイルをアクセスした時に 消えてしまうのではないかと思っています。このような事は初めてなので とまどっています。

関連するQ&A

専門家に質問してみよう