FileGetObject 関数

更新 : 2007 年 11 月

ディスク ファイルからデータを読み込み、それを変数に格納します。

My 機能を使用すると、FileGetObject を使用するよりもファイル I/O 処理の生産性とパフォーマンスが格段に向上します。詳細については、「My.Computer.FileSystem オブジェクト」を参照してください。

Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As Object, _
   Optional RecordNumber As Integer = -1 _
)
' -or-
Overloads Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As Short, _
   Optional RecordNumber As Integer = -1 _
)
' -or-
Overloads Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As Integer, _
   Optional RecordNumber As Integer = -1 _
)
' -or-
Overloads Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As Single, _
   Optional RecordNumber As Integer = -1 _
)
' -or-
Overloads Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As Double, _
   Optional RecordNumber As Integer = -1 _
)
' -or-
Overloads Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As Decimal, _
   Optional RecordNumber As Integer = -1 _
)
' -or-
Overloads Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As Byte, _
   Optional RecordNumber As Integer = -1 _
)
' -or-
Overloads Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As Boolean, _
   Optional RecordNumber As Integer = -1 _
)
' -or-
Overloads Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As Date, _
   Optional RecordNumber As Integer = -1 _
)
' -or-
Overloads Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As System.Array, _
   Optional RecordNumber As Integer = -1, _
   Optional ArrayIsDynamic As Boolean = False _
)
' -or-
Overloads Public Sub FileGetObject( _
   ByVal FileNumber As Integer, _
   ByRef Value As String, _
   Optional RecordNumber As Integer = -1, _
   Optional StringIsFixedLength As Boolean = False _
)

パラメータ

  • FileNumber
    必ず指定します。有効なファイル番号です。

  • Value
    必ず指定します。読み込んだデータを格納する変数名。

  • RecordNumber
    省略可能です。読み込みを始めるレコード番号 (Random モードのファイル) またはバイト位置 (Binary モードのファイル)。

  • ArrayIsDynamic
    省略可能です。配列を書き込む場合にだけ適用されます。配列を動的に処理するかどうか、および配列のサイズと境界を表す配列記述子を書き込むかどうかを指定します。

  • StringIsFixedLength
    省略可能です。文字列を書き込む場合にだけ適用されます。文字列の長さを表す 2 バイトの記述子を書き込むかどうかを指定します。既定では False です。

解説

整数型 (Integer)、長整数型 (Long)、Short 型 (Short) などではなくオブジェクト型 (Object) が渡される場合は、FileGet 関数の代わりに FileGetObject 関数を使って、コンパイル時のあいまいさを回避します。

バリアント型 (Variant) を書き出す場合は、FileGetObject を使う必要があります。判断に迷った場合、2 番目のパラメータにオブジェクトを使っているならば FilePutObject と FileGetObject を使った方が安全です。

FileGetObject は、Random モードおよび Binary モードの場合にだけ有効です。

通常、FileGetObject 関数を使用して読み込んだデータは、FilePutObject 関数を使用して書き込みます。

ファイルの中で先頭のレコード番号またはバイト位置は 1 になり、2 番目のレコード番号またはバイト位置は 2 になります。引数 RecordNumber を省略すると、FileGetObject は最後に呼び出した FileGetObject 関数または FilePutObject 関数、または最後に呼び出した Seek 関数が示す位置の次のレコードまたはバイトを読み込みます。

Random モード

Random モードで開いたファイルに対しては、次の規則が適用されます。

  • 読み込むデータの長さが FileOpen 関数ステートメントの RecordLength 句で指定したレコード長よりも短ければ、FileGetObject 関数はレコード長の終端から次のレコードを読み込むことができます。レコードの終わりと次のレコードの先頭の間には、ファイル バッファの内容が埋め込まれます。埋め込まれるデータ量は正確にわからないので、読み込まれているデータの長さにレコード長を合わせます。

  • 文字列変数を使う場合、FileGetObject 関数は、既定では文字列の長さを示す 2 バイトの記述子を読み込んでから、変数に格納するデータを読み込みます。したがって、FileOpen 関数の RecordLength 句では、文字列の実際の長さより 2 バイト以上大きい値を指定する必要があります。Visual Basic 6.0 以前のバージョンは固定長文字列をサポートしており、ファイルに書き込む場合、長さ記述子は書き込まれません。記述子なしで文字列を読み込む場合は、パラメータ StringIsFixedLength に True を渡します。この場合は、読み込む文字列の長さは正しいことが必要です。

  • 配列型の変数を使う場合は、配列のサイズと次元を表す記述子を読み込むかどうかを選択できます。記述子を読み取るには、パラメータ ArrayIsDynamic を True に設定します。配列を読み取る場合は、配列の書き込み方法に合わせる必要があります。記述子を書き込む場合は、記述子を読み込む必要があります。記述子を使用しない場合は、FileGetObject 関数に渡される配列のサイズと境界を使って、読み込む対象を決定します。

    記述子は、配列のランク、サイズ、および各ランクの最小値を指定します。長さは、2 に 8 と次元数の積を加えた値 (2 + 8 * NumberOfDimensions) になります。FileOpen 関数のパラメータ RecordLength で指定するレコード長は、データと配列の記述子を書き込むために必要なバイト数の合計、またはそれ以上である必要があります。たとえば、次の配列を定義した場合は、配列がディスクに書き込まれるときに 118 バイトが必要になります。

    Dim MyArray(4,9) As Integer
    

    118 バイトは、記述子のための 18 バイト (2 + 8 * 2)、データのための 100 バイト (5 * 10 * 2) を合わせた値です。

  • 構造体の要素を FileGetObject 関数を使って読み込む場合、各要素は独立しているように読み込まれます。ただし、各要素の間には何も埋め込まれません。FilePutObject 関数を使用してユーザー定義型に含まれる動的配列をディスクに書き込むと、記述子が前置されます。この記述子の長さは、2 に 8 と次元数の積を加えた値 (2 + 8 * NumberOfDimensions) に等しくなります。FileOpen 関数の RecordLength 句で指定するレコード長は、データと配列の記述子を読み込むために必要なバイト数の合計、またはそれ以上である必要があります。VBFixedStringAttribute クラス を構造体内の文字列フィールドに適用すると、ディスクに書き込むときに文字列のサイズを示すことができます。

Binary モード

ファイルを Binary モードで開いた場合も、次に示す例外を除いて、Random モードとすべて同じ規則が適用されます。

  • FileOpen 関数の RecordLength 句は何もしません。FileGetObject はすべての変数をディスクから連続して読み込みます。つまり、レコードの間に何も埋め込みません。

  • 構造体配列以外の配列の場合、FileGetObject 関数はデータだけを読み込みます。記述子は読み込みません。

構造体の要素でない可変長文字列を使用する場合、FileGetObject 関数は、2 バイトの記述子を読み込みません。読み込まれるバイト数は、文字列内の文字数と同じです。

y1swwyc4.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

ファイルからデータを読み取るときは、ファイル名の拡張子に基づいてファイルの内容を判断しないでください。たとえば、Form1.vb という名前のファイルが Visual Basic のソース ファイルとは限りません。

使用例

次に示すのは、テスト用のファイルにレコードを読み込んでからそれを取得する例です。

Dim c As Object = "test"
FileSystem.FileOpen(1, "test.dat", OpenMode.Binary)
FileSystem.FilePutObject(1, "ABCDEF")
FileSystem.Seek(1, 1)
FileSystem.FileGetObject(1, c)
MsgBox(c)
FileSystem.FileClose(1)

スマート デバイス開発者のためのメモ

この関数はサポートされていません。

必要条件

名前空間 : Microsoft.VisualBasic

モジュール : FileSystem

アセンブリ : Visual Basic ランタイム ライブラリ (Microsoft.VisualBasic.dll)

参照

参照

FilePut 関数

FileOpen 関数

Seek 関数

FileGet 関数

その他の技術情報

Visual Basic でのファイルの読み取り

Visual Basic でのファイルへの書き込み