• ベストアンサー

ファイルシステムオブジェクト(FSO)について

ふと疑問に思ったんですけど、 ファイルやディレクトリの一覧の利用(コレクション)には FolderオブジェクトのFilesやSubFoldersを利用するんですけど、 これってFolderクラスを継承したサブクラスになりますか? それともFolderオブジェクトには該当フォルダの全データが格納されていて、 コレクション以下はただ単にFolderオブジェクトの メンバ変数にアクセスしているだけになりますか? 説明では新たにインスタンスを作成しているように感じられないので、 よろしくお願いします。

  • ruby7
  • お礼率67% (63/94)

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.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 アクセスが有った時に作られる場合もあるかもしれません)

ruby7
質問者

お礼

たびたびの回答ありがとうございます。 >ちゃんとした答えは、MSの開発者でないと答えられないと思いますので これは新鮮な意見でした。 私はてっきり解があるものだとばかり固執していました。 公開されていなければ誰にも分かりませんよね。 >ルートフォルダのフォルダオブジェクトを作った時点で・・・ >そのようなコストは、高すぎます。 なるほど、ごもっともです。 そう考えると使う予定もないタイミングでオブジェクトを自動的に作成するのが 愚の骨頂だと分かります。この筋も捨てきれないでいました。 >for each のようなEnum アクセスが有った時に作られる場合も それが私の最初の結論でもあったのですが、、、 For Enumはコレクションを揃えてから発行するのが筋ではないかと思い、 しっくり来なかったのです。 今しがた考えているのは、実はインスタンスは最初のFSOと getfolderのフォルダオブジェクトの2つしか作成されていないかもです。 fcやfはFAT上の位置を指し示すメンバ変数があって、 その位置を示す変数で情報を返しているだけではないかということです。 こう考えれば総なめにしてオブジェクトを作る必要もなくなります。 でも、全く自信が持てない。。。 この件に関してはとりあえず、ここでいったん封印します。 どうもありがとうございました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>FolderオブジェクトのFilesやSubFoldersを利用するんですけど、これってFolderクラスを継承したサブクラスになりますか? サブクラスではないです。 FolderオブジェクトのFiles は、フォルダーに含まれるファイルオブジェクトのコレクションです。 FolderオブジェクトのSubFolders (サブ)フォルダーオブジェクトのコレクションです。 結局、コレクションに含まれているのがそれぞれのオブジェクトなので、プログラマがインスタンスを作成する必要はないです。 メンバ変数と考えてもいいです(というかプロパティ)。

ruby7
質問者

お礼

回答ありがとうございます。 そうですよね、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のメンバ変数にアクセスしているだけかなと思い、 冒頭の質問になったわけです。

関連するQ&A

  • サブクラス型オブジェクトをスーパークラス方に代入

    ある所で下記のような継承についての記述をみつけました。 ----------------------------------------------------------------------------- 継承の目的は、あるクラスで実装したメソッドなどの機能を利用して、 さらに実装を追加する差分コーディングです。 一つのクラスから複数のサブクラスを作ることも良くあります。 このような時、それらのサブクラス型オブジェクトの参照を代入できる変数として、 スーパークラス型変数を使うことがしばしばあります。 ----------------------------------------------------------------------------- サブクラス型オブジェクトの参照を代入できる変数として、 スーパークラス型変数を使うことがある、と いうのはどういった場合に使うのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 継承について

    下の質問の回答、間違ってませんか? -------------------------------------------- 親クラスのフィールドをメソッドを全て継承することになります。よって、サブクラス2は、サブクラス1とスーパークラスのメンバーを全て持つことになります。サブクラス2をインスタンス化すると、サブクラス1とスーパークラスが全てインスタンス化(コンピューターのメモリ上等に配置)されます。 ただ、可視性というものがあり、サブクラスから親クラスのメンバーを直接取り扱えない場合があります。privateや可視性修飾子無しの場合、サブクラスから直接取り扱えません。ただ、継承はされているので、インスタンスとしては存在します。例えば、 class スーパークラス{ private int abc; public int getAbc(){ return this.abc; } というクラスがあり、これを継承したサブクラスがあったとします。 サブクラスからは、privateなメンバー変数abcは直接取り扱うことができません。ただ、publicなgetAbcメソッドはサブクラスから取り扱えます。これで何が分かるかといいますと、privateなメンバーでもサブクラスに継承されるのです。単に可視性の問題で直接取り扱えないだけなのです。 また、オーバーライドされたメソッドがあったとしても、super.メソッド()で親のメソッドも呼べますので、これも継承されているのです。

  • Folderオブジェクトでsubfoldersプロパティが使えない

    Excel2000のVBAで、ユーザーがダイアログで選択したフォルダのサブフォルダのコレクションを取得しようとしています。 次のようなコード1にしたら、oFolderオブジェクトでは「Subfoldersプロパティをサポートしていない」旨のエラーが出ます。そこで、もう一段関数をかませて、その関数中でSet oFileSys = CreateObject("Scripting.FileSystemObject")    Set folder1 = oFileSys.GetFolder(folder_name)のようにして、別途folderオブジェクトを作成し、コード1の「colFolder」へ返すようにしてみたところ、うまく動きました。下記コード1中の「oFolder」と上の関数内の「folder1」は、いずれもFolderオブジェクトなのに、プロパティの種類が違うのはなぜでしょうか? ちなみに、オブジェクトブラウザで調べると、Folderクラスには、subfoldersプロパティというのが確かにありません!が、VBのヘルプにはしっかりとFolderオブジェクトの中にSubfoldersプロパティが載っています。 <コード1> Function フォルダ選択(メッセージ As String) As Object Dim oShell As Object,oFolder As folder,colFolder As Object Set oShell = CreateObject("Shell.Application") Set oFolder = oShell.BrowseForFolder(0, メッセージ, 1, "S:\")   If Not (oFolder Is Nothing) Then Set colFolder = oFolder.subfolders Set フォルダ選択=colFolder Else MsgBox "フォルダを選択しないと継続できません。" End;End If;END SUB

  • インスタンスとオブジェクト

    こんばんは。 変数について教えて下さい。 プログラム自体が初めてなので 「たのしい Ruby 第3版」を読んでいます。 ずっとインスタンスとオブジェクトの違いが曖昧なままです。 その本の「クラスとモジュール」という章にて クラスを定義する構文。 インスタンス変数とローカル変数の違いですが、 以下の説明で一部理解できずにつまずいています。 ―――――――――――― @ で始まる変数は インスタンス変数 といいます。 ローカル変数はメソッドごとに異なる変数として扱われますが、 インスタンス変数は同じインスタンス内であれば、 メソッド定義を超えてその値を参照したり、変更したりできます。 なお、初期化されていないインスタンス変数を参照すると nil が得られます。 インスタンス変数は、インスタンスごとに違う値を持つことができます。 またインスタンス変数は、 インスタンスがある間は値を保持しておいて 何度でも利用することができます。 一方、ローカル変数はメソッド呼び出しごとに新しく割り当てられるため、 メソッドから抜けると値を忘れてしまいます。 ―――――――――――― ここで分からないのは、 ・ローカル変数が "メソッドごと" に異なる変数として扱われる ・インスタンス変数は同じ "インスタンス内" であれば、 メソッド定義を超えてその値を参照したり、変更したりできます の部分です。 Webで検索してますが、 プログラミング経験ありを前提で書かれているような。 他の言語も知らないので分からない、そんなページが多いです。 人に聞くからには 自分でも頑張って理解できるように考えますので、 どうか回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • インスタンスオブジェクトとは何かについて教えて!!

    下記内容はあるサイトのインスタンスについての説明文です。 画像は、自分なりに理解したものです。 (1)メモリ上には記憶場所(=ポインタ)はない (2)var Aa = new Bb("13" , "smole");とscript内に追加されたことにより メモリ上に記憶場所(=ポインタ)が作成され、 BbオブジェクトつまりBb("13" , "smole");がその記憶場所(=ポインタ)に入る (3)そしてBb("13" , "smole");が入った 記憶場所(=ポインタ)にAaという名前を付ける。 考え方に間違いがあるでしょうか? ---------------------------------------------------- var Aa = new Bb("13" , "smole"); これは、BbクラスオブジェクトのBbコンストラクタをnew演算子を利用して起動しています。 new演算子は、メモリ上に記憶場所を確保して、Bbオブジェクトを作成した後、そのポインタを返す演算子です。 new演算子から返されたポインタは、Aaへ格納されます。この場合のAaをBbオブジェクトのインスタンスといいます。 また、new演算子でメモリ上に記憶場所を確保して作られたオブジェクトをインスタンスオブジェクトといいます。 つまり、 オブジェクト == インスタンスオブジェクト で、 インスタンス != インスタンスオブジェクト インスタンス != オブジェクト です。 ----------------------------------------------------

  • FSOを使いサブフォルダのファイル操作

    同じ階層のサブフォルダにxlsm入るが入っており、VBAによりモジュールを解放しようと試みています。 まずは、FSOを使ってサブフォルダにアクセスしようとしましたが、下から6行目でエラー(424 オブジェクトが必要です)が出てしまい、解決できませんので、ご教示いただけないでしょうか? よろしくお願いします Sub DeleteMain() With Application.FileDialog(msoFileDialogFolderPicker) If Not .Show Then Exit Sub Call DeleteSub(folderPath:=.SelectedItems(1)) End With End Sub Sub DeleteSub(folderPath As String, Optional mycount As Long = 0) Dim fso As Object, myFolders As Object, myfile As Object Set fso = CreateObject("Scripting.FileSystemObject") Set myFolders = fso.GetFolder(folderPath).SubFolders For Each myfile In fso.GetFolder(folderPath).Files mycount = mycount + 1 ' Cells(mycount, 1) = myfile.Path Debug.Print myfile.Path Next For Each myFolders In fso.GetFolder(folder.Path).SubFolders Call DeleteSub(myFolder.Path, mycount) Next Set fso = Nothing Set myFolders = Nothing End Sub

  • C++別のオブジェクトからメンバ関数をコールバック

    自作のタイマオブジェクトにコールバックしたい別のオブジェクトのメンバ関数(複数)を登録して、一定時間経過後にコールバックしたいです。 今、考えているのはタイマオブジェクトでコールバック関数を呼び出す関数を仮想関数にして、継承したサブクラスごとにどのコールバック関数を呼び出すか処理を変えるやり方です。 ただ、これだと何だか複雑になりそうですし、そもそも根本的なところが間違っている気もします。 ご助言いただきたいです。 よろしくお願いします。

  • コレクションってなんですか?

    UWSCを勉強しています。そこでGETOLEITEMという関数が何を取得するのかわかりません。戻り値はゲットしたコレクションの数と書かれていますが、コレクションが何をさしているのかわかりません。これはどういったものなのでしょうか? // コレクションの取得 戻値 = GETOLEITEM( コレクションプロパティ名 ) 引数   コレクションプロパティ名: COMオブジェクト.コレクション取得プロパティ名 戻値   ゲットしたコレクションの数   習得した物は配列変数の ALL_OLE_ITEM[ ] に格納される (配列はゼロから) // c:\windows下のディレクトリ表示 fs = CreateOLEObj("Scripting.FileSystemObject") gf = fs.GetFolder("c:\windows") for i = 0 to GETOLEITEM(gf.SubFolders)-1 // コレクション取得   print ALL_OLE_ITEM[i].name next

  • Cドライブ全てをEveryoneフルコントロールにする方法を教えてくだ

    Cドライブ全てをEveryoneフルコントロールにする方法を教えてください 今までは当方のOSはWindowsXPかWindows2000でした。 Windows2000やWindowsXPでCドライブ(ルートディレクトリ)のセキュリティのアクセス許可を「Everyoneフルコントロール」にし、「子オブジェクトのアクセス許可全てをこのオブジェクトからの継承可能なアクセス許可で置き換え」をしていました。 これでWindowsフォルダやProgram FilesフォルダもEveryoneフルコントロールになっているのを確認できていました。 Windows7を導入する事になりました。 上記と同じ事を行なうと… Cドライブ(ルートディレクトリ)上ではEveryoneフルコントロールにはなっています。が… 「子オブジェクトのアクセス許可全てをこのオブジェクトからの継承可能なアクセス許可で置き換える」をすると… > c:\windows C:\Program Files > アクセスが拒否されました となってしまいます。 確認の為にWindowsフォルダやProgram Filesフォルダでセキュリティを確認すると… CREATER OWNER、SYSTEM、Administrator、Users、TrustedInstallerはありますがEveryoneがありません。 またこれらのユーザ達どれもフルコントロールになっていません。 ルートディレクトリではEveryoneフルコントロールになっているのに下位階層に反映されません。 どうにかして、WindowsフォルダやProgram FilesフォルダをEveryoneフルコントロールにする事ができないでしょうか? 教えてください。よろしくお願いいたします。

  • JavaScript ミニゲーム作成中に・・・

    こんにちは。趣味でプログラミングをしているものです。 JavaScriptで1から25までの数字が 正方形を25個に分割した小さな正方形に ランダムに配置されたものをクリックしていく、 というミニゲームをオブジェクト指向っぽく作っているのですが、 わからないところが出てきましたので質問させていただきます。 まず、ゲームの内容について説明させていただきます。 (1) htmlにdivタグを記述してidを 'stage' とします。 (2) ゲームの初期設定、処理を担当するのはGAMEクラスのインスタンスです (3) GAMEクラスは 'stage'に 正方形を 5*5 = 25 個の小さな正方形に分割した FieldPartクラスのインスタンスを配置します。 これらのインスタンスをリストに格納しておきます。 FieldPartインスタンスの描画は小さな正方形を表す divタグをフィールドにもち、border を指定して 'stage' にappend して 小さな正方形の枠を描画します。 数字のピースを表すスーパークラスPieceを定義しておき さらにサブクラスを定義します   FieldPartインスタンス一個を丸々埋め尽くすLPiece, FieldPartインスタンス一個の 半分の面積の横長の部分を埋めるHtPiece FieldPartインスタンス一個の 半分の面積の縦長の部分を埋めるVtPiece,です。   HtPiece, VtPiece はどの一行あるいは一列をみても   各ひとつずつ配置されるようにします。 これらサブクラスの描画も createElementでdivを作成し、   FieldPartインスタンスのフィールドが保持するdivにappendします。 このappendを担当するPiece のサブクラスのメソッドは (各サブクラス).prototype.belongTo = fundtion( fieldpart ) { 以下省略 } と記述しました。 (4) Piece クラスの各サブクラスへの継承ですが 以下のサイトを参考にさせていただきました。 http://d.hatena.ne.jp/vividcode/20110316/1300269173   この中の Classical Pattern #5 を用いました。 そして (各サブクラス).prototype.belongTo = function( fieldpart ) { // } として定義しました。 (5) 実行してみると、LPiece はうまくappend できるようです。 HtPiece は div の height が少し大きめに描画されるようですが append できます。 これについてはまたあとで考えるとして 問題はVtPiece なのですが VtPiece の belongTo の実行になると IE は [オブジェクトは 'vtBelongTo' プロパティまたはメソッドをサポートしていません。] というエラーメッセージを表示します。 各サブクラスのPieceクラスからの継承の記述の順番はLPiece, HtPiece, VtPieceですが 何か関係があるのでしょうか? スペルミス等がない場合には [オブジェクトは 'vtBelongTo' プロパティまたはメソッドをサポートしていません。] というエラーメッセージが表示される原因としては どのようなものが考えられるのでしょうか? ご存知の方、教えていただけないでしょうか? よろしくお願いします。

専門家に質問してみよう