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
No.4ベストアンサー
- 回答日時:
このフォルダにはインデックスサービスを利用してファイル検索を高速にするための情報が入っているようです。
しかし、この中身を勝手に参照されると困るようで、アクセス制御によってどんなファイルが入っているかはもちろん、このフォルダの作成日時なども見られないようになっています。
管理者は無理矢理このフォルダの内容を見ることができますが、やめたほうがいいでしょう。
よって、このフォルダの中身を参照しようとすると、VBの場合実行時エラーが発生します。
これは、おそらくFileSystemObjectを使っているのが原因で、このオブジェクトはフォルダ名を参照するだけでもそのフォルダの情報を取得しようとしている可能性があります。
API関数なら "参照できませんでした、はい残念" で済むのですが、VBコンポーネントの場合、外側でOn Error Resume Nextを指定しても中まで届かないことがあるみたいです。
API関数を使う方法を知っていますか?
WIN32_FIND_DATA
FindFirstFile
FindNextFile
FindClose
これらのキーワードで検索してみてください。
回答有難う御座います。
TreeViewにすべてのフォルダを表示するには、フォルダの再帰検索を
しなければなりませんが、Dir関数を使って無理やり再帰検索すると
かなり面倒なプログラムになります。
このMicrosoft Scripting Runtimeを参照設定して、FileSystemObjectを
使うと嘘のように簡単になるので、「これはいい!」と
思ったのですが.....。 駄目なようですね。
そのAPI関数を使うか、あるいはVBでフォルダの再帰検索をすると
かなり時間がかかるので、VC++でフォルダ再帰検索のActiveXを作って
そのOCXを参照設定するか、これから検討してみます。
大変参考になりました。有難うございました。
No.5
- 回答日時:
VCでOCXを作る力があるくらいなら、VBからAPIでファイルリストを作ることも簡単でしょう。
>かなり時間がかかるので
じつは、FileSystemObjectは、あまり効率のいい構造はしていないみたいです。
フォルダやファイル1つ1つが固有のオブジェクトになっているため、検索のたびにそれぞれがインスタンスを作るので、余計なメモリも消費されているようです。
FindFirstFileは作成時間や属性なども同時に取得してくれるので、エクスプローラの様なアプリケーションを作るために必要な情報は、一通りそろっています。
それでも、FileSystemObjectの10倍くらい速いみたいです(根拠なし)。
楽してインターフェースから作り始めるのもいいですが、内部からごりごり作っていくのもおもしろいですよ。
がんばってください。
この回答への補足
有難うございます。
>VCでOCXを作る.......。
などと表面だけ見ると、いかにも実力がありそうにみえますが実際は
参考書とのにらみ合いになるでしょう。
No.3
- 回答日時:
if(curFolder.Path = "System Volume Information")then
else
end if
この回答への補足
>if(curFolder.Path = "System Volume Information")then
>else
>end if
回答有難うございます。
上記のサンプルを実行してみましたが、"For Each ....." の所で
"書き込み出来ません"のエラーが出て駄目でした。
No.2
- 回答日時:
>EXEファイルを実行した時に、多分エラーになるファイルをアクセスした時に
>消えてしまうのではないかと思っています。
それなら、MsgBox curFolder.Pathを入れることにより、エラーになるファイル
を含むフォルダを特定できるのでは?
この回答への補足
>それなら、MsgBox curFolder.Pathを入れることにより、
>エラーになるファイルを含むフォルダを特定できるのでは?
再度の回答、有難う御座います。
最初の質問に書きましたが "System Volume Information" をアクセスした
時にエラーになるようです。何かシステムに関係あるファイルのようで
Cドライブにも、Dドライブにもあります。何故このフォルダ(?)を
アクセスした時にエラーになるのか、あるいはこのフォルダ(?)を
アクセスしないようにすれば、実行画面が消えないのでは....と
思いますがそれが分かりません。
No.1
- 回答日時:
>' Debug.Print curFolder.Path
MsgBox curFolder.Path にしてみては?
この回答への補足
>MsgBox curFolder.Path にしてみては?
早速の回答、有難うございます。
' Debug.Print curFolder.Path はどんなファイルをアクセスした時に
エラーになるのかを確認するためにいれてあります。実行ファイル作成時は
コメントにしています。
VBのデバッグ環境では正常に動作しますが、EXEファイルを
実行した時に、多分エラーになるファイルをアクセスした時に
消えてしまうのではないかと思っています。このような事は初めてなので
とまどっています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
保存先のフォルダ名を指定した...
-
Dreamweaverでイメージを挿入す...
-
Access VBA で フォルダ権限...
-
ファイルサイズを指定してファ...
-
PytionでOneDriveへのアップロ...
-
エクセル VBA Filename:=Left(T...
-
Hitachi Embedded Workshop (HE...
-
ファイル名に特定の文字列を含...
-
DIR関数
-
Downloaded Program Filesはど...
-
outlook マクロが終了しません。
-
会社のネットワーク上のファイ...
-
VB.NRT FolderBrowserDialogを...
-
ツリービューを使って、エクス...
-
デスクトップの画像をhtmlに表...
-
【マクロ】ファイル名の日付に...
-
エクセルマクロで指定フォルダ...
-
Excelで指定したフォルダに保存...
-
VBでフォルダをパスワードでロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
VBA 最新のフォルダ取得
-
ファイル名と同名のフォルダを...
-
デスクトップの画像をhtmlに表...
-
Excelのハイパーリンクについて...
-
VBプロジェクトでのフォルダ構...
-
会社のネットワーク上のファイ...
-
【マクロ】ファイル名の日付に...
-
パス名に2バイト文字(マルチバ...
-
Access VBA で フォルダ権限...
-
カレントフォルダって?
-
VBA フォルダ名に特定の文字を...
-
ExcelVBAでフォルダへのハイパ...
-
C ファイル出力で、フォルダが...
-
excelマクロ 冒頭3文字が一致す...
-
保存先のフォルダ名を指定した...
-
マクロVBAのフォルダ階層別で検...
-
Excelで指定したフォルダに保存...
-
ディレクトリ名変更してコピー...
-
vbsで選択ダイアログを表示した...
おすすめ情報