- ベストアンサー
ファイルシステムオブジェクト(FSO)について
ふと疑問に思ったんですけど、 ファイルやディレクトリの一覧の利用(コレクション)には FolderオブジェクトのFilesやSubFoldersを利用するんですけど、 これってFolderクラスを継承したサブクラスになりますか? それともFolderオブジェクトには該当フォルダの全データが格納されていて、 コレクション以下はただ単にFolderオブジェクトの メンバ変数にアクセスしているだけになりますか? 説明では新たにインスタンスを作成しているように感じられないので、 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1>このf1のインスタンスって作成されているのかなあっていうのが疑問なんです。 #1>作成されているのなら、どのタイミングで作成されるのでしょうか? ちゃんとした答えは、MSの開発者でないと答えられないと思いますので、以下の回答は私の推測ですが、 一般に、プロパティは、静的なメンバではなくて、get(読込しようとした時)、set(書込しようとした時)にメソッドとして実行され、値がセットされたり返されたりします。 実体はプライベートなメンバだったり、動的に作成されるデータだったりします。 そこで、フォルダオブジェクトについて考えてみると、 例えば、ルートフォルダのフォルダオブジェクトを作ったとすると、 全てが静的なメンバだったとしたら、ルートフォルダのフォルダオブジェクトを作成する時に、全てのフォルダとファイルを総なめしてアクセスする必要があります。 ルートフォルダのフォルダオブジェクトを作った時点で、そのような下部フォルダが利用されるかどうかは(もし利用されると分かっていれば、後々は楽できますが)わかりませんので、そのようなコストは、高すぎます。(今どきのGBクラスのデータを保持するドライブなら、HDランプが付きっぱなしになりしばらく応答が返ってこないでしょう) なので、該当プロパティにアクセスがあった時に該当オブジェクトを作成していると思います。 >Set fc = f.Files >For Each f1 in fc の例でいうと、Set fc = f.Files の時点でそれぞれのファイルオブジェクトが作られそのコレクションが返されると思います。 (場合によっては、コレクションは、実体ではなくて、for each のようなEnum アクセスが有った時に作られる場合もあるかもしれません)
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>FolderオブジェクトのFilesやSubFoldersを利用するんですけど、これってFolderクラスを継承したサブクラスになりますか? サブクラスではないです。 FolderオブジェクトのFiles は、フォルダーに含まれるファイルオブジェクトのコレクションです。 FolderオブジェクトのSubFolders (サブ)フォルダーオブジェクトのコレクションです。 結局、コレクションに含まれているのがそれぞれのオブジェクトなので、プログラマがインスタンスを作成する必要はないです。 メンバ変数と考えてもいいです(というかプロパティ)。
お礼
回答ありがとうございます。 そうですよね、subfoldersやfilesってプロパティなんですよね。 この辺に解決の鍵があるかなって2日間ランチの時とか考えてみたけど、 解決に至りませんでした。 多分ファイルオブジェクトとサブフォルダオブジェクトはそれぞれ存在 するのでしょうけど、どのタイミングで作成されるのか分からなくて・・・ 発端は次のコードなんです。 Dim fs, f, f1, fc As Object Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.GetFolder( fpath ) Set fc = f.Files For Each f1 in fc ・・・・・・ Next f1がそれぞれのファイルオブジェクトなんですけど、 このf1のインスタンスって作成されているのかなあっていうのが疑問なんです。 作成されているのなら、どのタイミングで作成されるのでしょうか? それでf1は実はfのメンバ変数にアクセスしているだけかなと思い、 冒頭の質問になったわけです。
お礼
たびたびの回答ありがとうございます。 >ちゃんとした答えは、MSの開発者でないと答えられないと思いますので これは新鮮な意見でした。 私はてっきり解があるものだとばかり固執していました。 公開されていなければ誰にも分かりませんよね。 >ルートフォルダのフォルダオブジェクトを作った時点で・・・ >そのようなコストは、高すぎます。 なるほど、ごもっともです。 そう考えると使う予定もないタイミングでオブジェクトを自動的に作成するのが 愚の骨頂だと分かります。この筋も捨てきれないでいました。 >for each のようなEnum アクセスが有った時に作られる場合も それが私の最初の結論でもあったのですが、、、 For Enumはコレクションを揃えてから発行するのが筋ではないかと思い、 しっくり来なかったのです。 今しがた考えているのは、実はインスタンスは最初のFSOと getfolderのフォルダオブジェクトの2つしか作成されていないかもです。 fcやfはFAT上の位置を指し示すメンバ変数があって、 その位置を示す変数で情報を返しているだけではないかということです。 こう考えれば総なめにしてオブジェクトを作る必要もなくなります。 でも、全く自信が持てない。。。 この件に関してはとりあえず、ここでいったん封印します。 どうもありがとうございました。