プロが教えるわが家の防犯対策術!

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

A 回答 (5件)

このフォルダにはインデックスサービスを利用してファイル検索を高速にするための情報が入っているようです。


しかし、この中身を勝手に参照されると困るようで、アクセス制御によってどんなファイルが入っているかはもちろん、このフォルダの作成日時なども見られないようになっています。
管理者は無理矢理このフォルダの内容を見ることができますが、やめたほうがいいでしょう。
よって、このフォルダの中身を参照しようとすると、VBの場合実行時エラーが発生します。

これは、おそらくFileSystemObjectを使っているのが原因で、このオブジェクトはフォルダ名を参照するだけでもそのフォルダの情報を取得しようとしている可能性があります。
API関数なら "参照できませんでした、はい残念" で済むのですが、VBコンポーネントの場合、外側でOn Error Resume Nextを指定しても中まで届かないことがあるみたいです。

API関数を使う方法を知っていますか?

WIN32_FIND_DATA
FindFirstFile
FindNextFile
FindClose

これらのキーワードで検索してみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/20 20:01

VCでOCXを作る力があるくらいなら、VBからAPIでファイルリストを作ることも簡単でしょう。



>かなり時間がかかるので
じつは、FileSystemObjectは、あまり効率のいい構造はしていないみたいです。
フォルダやファイル1つ1つが固有のオブジェクトになっているため、検索のたびにそれぞれがインスタンスを作るので、余計なメモリも消費されているようです。

FindFirstFileは作成時間や属性なども同時に取得してくれるので、エクスプローラの様なアプリケーションを作るために必要な情報は、一通りそろっています。
それでも、FileSystemObjectの10倍くらい速いみたいです(根拠なし)。

楽してインターフェースから作り始めるのもいいですが、内部からごりごり作っていくのもおもしろいですよ。
がんばってください。

この回答への補足

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

補足日時:2002/02/20 20:31
    • good
    • 0

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


else
end if

この回答への補足

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

回答有難うございます。
上記のサンプルを実行してみましたが、"For Each ....." の所で
"書き込み出来ません"のエラーが出て駄目でした。

補足日時:2002/02/19 18:56
    • good
    • 0

>EXEファイルを実行した時に、多分エラーになるファイルをアクセスした時に


>消えてしまうのではないかと思っています。

それなら、MsgBox curFolder.Pathを入れることにより、エラーになるファイル
を含むフォルダを特定できるのでは?

この回答への補足

>それなら、MsgBox curFolder.Pathを入れることにより、
>エラーになるファイルを含むフォルダを特定できるのでは?

再度の回答、有難う御座います。

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

補足日時:2002/02/19 16:35
    • good
    • 0

>' Debug.Print curFolder.Path



MsgBox curFolder.Path にしてみては?

この回答への補足

>MsgBox curFolder.Path にしてみては?

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

補足日時:2002/02/19 14:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!