16
VS 2005 資料 【電脳梁山泊 烏賊塾】 -1- FileSystem クラスの利用 Microsoft.VisualBasic.FileSystem クラス FileSystem モジュールに含まれるプロシージャを使って、ファイル、ディレクトリ、又は、フォルダ 及び、システムの操作を実行する。My 機能を使用すると、 FileSystem モジュールを使用した場合より ファイル I/O 操作の生産性、及び、パフォーマンスが向上する。 名 前 空 間:Microsoft.VisualBasic アセンブリ:Microsoft.VisualBasic (microsoft.visualbasic.dll ) メモ:Microsoft.VisualBasic.FileIO 名前空間のクラスとは別物で有る。 FileSystem オブジェクト 解説 此のモジュールは、ファイルとフォルダにアクセスする Visual Basic 言語キーワード、及び、ランタイ ムライブラリメンバをサポートする。 使用例 此の例では、GetAttr 関数を使用してファイルやフォルダ(ディレクトリ)の属性を決定する。 Visual Basic Dim MyAttr As FileAttribute ' Assume file TESTFILE is normal and readonly. MyAttr = GetAttr("C:¥TESTFILE.txt") ' Returns vbNormal. ' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This file is normal.") End If ' Test for normal and readonly. Dim normalReadonly As FileAttribute normalReadonly = FileAttribute.Normal Or FileAttribute.ReadOnly If (MyAttr And normalReadonly) = normalReadonly Then MsgBox("This file is normal and readonly.") End If ' Assume MYDIR is a directory or folder. MyAttr = GetAttr("C:¥MYDIR") If (MyAttr And FileAttribute.Directory) = FileAttribute.Directory Then MsgBox("MYDIR is a directory") End If

ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-1-

■ FileSystem クラスの利用 ■

■ Microsoft.VisualBasic.FileSystem クラス

FileSystem モジュールに含まれるプロシージャを使って、ファイル、ディレクトリ、又は、フォルダ

及び、システムの操作を実行する。My機能を使用すると、FileSystem モジュールを使用した場合より

ファイル I/O操作の生産性、及び、パフォーマンスが向上する。

名 前 空 間:Microsoft.VisualBasic

アセンブリ:Microsoft.VisualBasic (microsoft.visualbasic.dll 内)

メモ:Microsoft.VisualBasic.FileIO 名前空間のクラスとは別物で有る。

■ FileSystem オブジェクト

解説

此のモジュールは、ファイルとフォルダにアクセスする Visual Basic 言語キーワード、及び、ランタイ

ムライブラリメンバをサポートする。

使用例

此の例では、GetAttr 関数を使用してファイルやフォルダ(ディレクトリ)の属性を決定する。

Visual Basic

Dim MyAttr As FileAttribute

' Assume file TESTFILE is normal and readonly.

MyAttr = GetAttr("C:¥TESTFILE.txt") ' Returns vbNormal.

' Test for normal.

If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then

MsgBox("This file is normal.")

End If

' Test for normal and readonly.

Dim normalReadonly As FileAttribute

normalReadonly = FileAttribute.Normal Or FileAttribute.ReadOnly

If (MyAttr And normalReadonly) = normalReadonly Then

MsgBox("This file is normal and readonly.")

End If

' Assume MYDIR is a directory or folder.

MyAttr = GetAttr("C:¥MYDIR")

If (MyAttr And FileAttribute.Directory) = FileAttribute.Directory Then

MsgBox("MYDIR is a directory")

End If

フファァイイルル操操作作

Page 2: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-2-

■ FileSystem オブジェクトのコンストラクタ

FileSystem クラスの新しいインスタンスを初期化する。

名 前 空 間:Microsoft.VisualBasic.FileIO

アセンブリ:Microsoft.VisualBasic (microsoft.visualbasic.dll 内)

メモ:此のコンストラクタは、.NET Framework version 2.0 で新しく追加された物で有る。

構文

Visual Basic

Public NotInheritable Class FileSystem ' 宣言

Dim instance As FileSystem ' 使用法

C#

public sealed class FileSystem

C++

public ref class FileSystem sealed

■ FileSystem オブジェクトのメンバ

メソッド

名前 説明

ChDir 現在のディレクトリ(フォルダ)を変更する。

ChDrive 現在のドライブを変更する。

CurDir 現在のパスを表す文字列を返す。

Dir 指定パターン、又は、ファイル属性と一致するファイル名、ディレクトリ名、フ

ォルダ名を表す文字列、又は、ドライブのボリュームラベルを表す文字列を返す。

EOF ランダムモードかシーケンシャル入力モードで開いたファイルの現在位置がファ

イルの末尾に達して居る場合、ブール値 True を返す。

Equals 2 つの Objectインスタンスが等しいか何うかを判断する。

FileAttr FileOpen 関数を使用して開いたファイルのファイルモードを表す列挙体を返す。

FileClose FileOpen 関数を使用して開いたファイルへの入出力(I/O)を終了して、ファイ

ルを閉じる。

FileCopy ファイルをコピーする。

FileDateTime ファイルの作成日時や最終変更日時を示す日付型 Date の値を返す。

FileGet 開かれたディスクファイルのデータを変数に読み込む。

FileGetObject 開かれたディスクファイルのデータを変数に読み込む。

FileLen ファイルの長さをバイト単位で指定する Long 値を返す。

FileOpen ファイルを開いて入出力を行う。

FilePut 変数の内容をディスク上のファイルに書き込む。

FilePutObject 変数の内容をディスク上のファイルに書き込む。

FileWidth FileOpen 関数を使用して開いたファイルに出力行の桁数を割り当てる。

FreeFile FileOpen 関数で使用出来る次のファイル番号を表す Integer 値を返す。

GetAttr ファイル、ディレクトリ、又は、フォルダの属性を表す FileAttribute 型の値を

返す。

GetHashCode 特定の型のハッシュ関数と仕て機能する。GetHashCode は、ハッシュアルゴリズ

ムや、ハッシュテーブルの様なデータ構造での使用に適して居る。

Page 3: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-3-

GetType 現在のインスタンスの Type を取得する。

Input 開いて居るシーケンシャルファイルからデータを読み込み、其のデータを変数に

代入する。

InputString 入力モード、又は、バイナリモードで開いたファイルからの文字を含む String 値

を返す。

Kill ファイルをディスクから削除する。

LineInput 開かれたシーケンシャルファイルから 1 行を読み込み、String 変数に割り当てる。

Loc 開かれたファイル内の現在の読込と書込の位置を指定する Long 値を返す。

Lock Open 関数を使用して開かれたファイルの全部、又は、一部に対して、他のプロセ

スからのアクセスを制御する。

LOF FileOpen関数を使用して開かれたファイルのサイズをバイト単位で表す Longを

返す。

MkDir 新しいディレクトリを作成する。

Print 表示形式データをシーケンシャルファイルに書き込む。

PrintLine 表示形式データをシーケンシャルファイルに書き込む。

ReferenceEquals 指定した複数の Objectインスタンスが同一か何うかを判断する。

Rename ディスクファイル、又は、ディレクトリの名前を変更する。

Reset FileOpen 関数を使用して開いた総てのディスクファイルを閉じる。

RmDir 既存のディレクトリを削除する。

Seek FileOpen 関数を使用して開いたファイル内の現在の読込位置、又は、書込位置を

示す Long を返す。亦、FileOpen 関数で開いたファイルの、次に読込、又は、書

込を行う位置を設定する。

SetAttr ファイルの属性情報を設定する。

SPC Print 関数、又は、PrintLine 関数と共に使用し、出力の位置を移動させる。

TAB Print 関数、又は、PrintLine 関数と共に使用し、出力の位置を移動させる。

ToString 現在の Objectを表す String を返す。

Unlock Open 関数を使用して開かれたファイルの全部、又は、一部に対して、他のプロセ

スからのアクセスを制御する。

Write データをシーケンシャルファイルに書き込む。Write で書き込まれたデータは、

通常、Input でファイルから読み込まれる。

WriteLine データをシーケンシャルファイルに書き込む。Write で書き込まれたデータは、

通常、Input でファイルから読み込まれる。

■ ファイルをオープンする FileOpen 関数

ファイルに対して I/O 処理(入出力処理)を実行するには、其の前にファイルを開く必要が有る。

FileOpen 関数は、ファイルへの I/O 用にバッファを割り当て、其のバッファで何のアクセスモードを

使用するかを判断する。

FileOpen 関数の書式は、下記の通りで有る。

FileOpen( ファイル番号, ファイル名, ファイルモード, アクセスモード, ロックモード, レコード長 )

ファイル番号には、有効なファイル番号を指定し、必ず指定する。猶、FreeFile 関数を使用して、使用出来る次のフ

ァイル番号を取得する事が出来る。

Page 4: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-4-

ファイル名には、ファイル名を指定する文字列式を指定し、必ず指定する。猶、ディレクトリ名、フォルダ名、ドラ

イブ名も含めて指定する事が出来る。

ファイルモードには、ファイルを開くモードを下記の OpenMode 列挙型で指定し、必ず指定する。

メンバ 説明

Append 追加用にファイルを開く(既定値)。

Binary バイナリ アクセス用にファイルを開く。

Input 書き込みアクセス用にファイルを開く。

Output 読み取りアクセス用にファイルを開く。

Random ランダム アクセス用にファイルを開く。

アクセスモードには、ファイルに対して許可された操作を下記の OpenAccess 列挙型で指定し、省略可能で有る。

メンバ 説明

Default 読み取りと書き込みアクセスを許可する(既定の設定)。

Read 読み取りアクセスを許可する。

ReadWrite 読み取りと書き込みアクセスを許可する。

Write 書き込みアクセスを許可する。

ロックモードには、開いて居るファイルに対する他のプロセスに依る許可されない操作を下記の OpenShare 列挙型で

指定し、省略可能で有る。

メンバ 説明

Default 他のプロセスは此のファイルに対して読み取りも書き込みも出来ない(既定の設定)。

LockRead 他のプロセスは此のファイルを読み取る事が出来ない。

LockReadWrite 他のプロセスは此のファイルに対して読み取りも書き込みも出来ない。

LockWrite 他のプロセスは此のファイルに書き込む事が出来ない。

Shared 総てのプロセスが此のファイルに対して読み取りと書き込みが出来る。

レコード長には、ランダムアクセスの場合は、レコード長を、シーケンシャルアクセスの場合は、バッファの容量を

表す数値を 32,767 バイト以下の数値で指定し、省略可能で有る。

※ ファイルへの書き込みを行う時、書き込み先のファイルが存在しなければ、アプリケーションでフ

ァイルを作成する事が必要に成る場合も有る。其の処理を行うには、ファイルの作成先と成るディ

レクトリへのアクセス許可が必要で有る。但し、ファイル名で指定されたファイルが存在すると、

アプリケーションに必要な権限は、ファイル其の物丈への Write アクセス許可に成る。可能で有れ

ば、配置時にファイルを作成し、ディレクトリ全体ではなく、其のファイル丈への Write アクセス

許可を与える方が安全で有る。安全性を高める為に、ルートディレクトリや Program Files ディレ

クトリではなく、ユーザーディレクトリへデータを書き込む様にする事が望ましい。

以下に、FileOpen 関数を試用してファイルへの入出力を可能にする様々な例を示す。

ファイル TestFile を Input モードで開くコード例は、下記の通りで有る。

FileOpen(1, "TESTFILE", OpenMode.Input)

ファイルを書き込み専用の Binary モードで開く例は、下記の通りで有る。

FileOpen(1, "TESTFILE", OpenMode.Binary,OpenAccess.Write)

Page 5: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-5-

ファイルを Random モードで開く例は、下記の通りで有る(ファイルには、構造体 Person のレコード

が含まれて居る物と仮定する)。

Structure Person

<VBFixedString(30)> Dim Name As String

Dim ID As Integer

End Structure

Public Sub ExampleMethod()

' 固定長文字列の 30 バイトと Integer型の 4 バイト

FileOpen(1, "TESTFILE", OpenMode.Random, , , 34)

' … FileClose(1)

End Sub

ファイルを Output モードで開く例は、下記の通りで有る。下記の例では、何のプロセスからでも、フ

ァイルの読み書きが出来る。

FileOpen(1, "TESTFILE", OpenMode.Output, OpenAccess.Default, OpenShare.Shared)

ファイルを読み込み専用の Binary モードで開く例は、下記の通りで有る。他のプロセスから、此のフ

ァイルを読む事は出来ない。

FileOpen(1, "TESTFILE", OpenMode.Binary, OpenAccess.Read, OpenShare.LockRead)

■ シーケンシャルファイルから1個のデータを読み込む Input 関数

シーケンシャル入力モードで開いたファイルからデータ(カンマか改行で区切られた 1 個のデータ)を

読み込んで、其れを変数に格納するには、Input 関数を使用する。Input 関数の書式は、下記の通りで

有る。

Input( ファイル番号, 変数 )

ファイル番号には、FileOpen 関数で指定したファイル番号を指定し、必ず指定する。

変数には、ファイルから読み込んだ値を格納する為の変数を指定し、必ず指定する。配列変数やオブジェクト変数を

指定する事は出来ない。

通常、Input 関数を使用して読み込んだデータは、Write 関数を使用して書き込む。此の関数は、Input

モードか Binary モードで開いたファイルに対して丈、使用する。

ファイルからデータを読み込む場合、通常、文字列データは文字列型(String)、数値データは数値デ

ータ型(Integer、Single 等)と仕て格納される。此れ以外のデータを読み込んだ場合、下記に示す様

に、データに依り、変数に格納される値が異なる。

データ 変数に格納される値

コンマのみ、または空白行 Empty

#NULL# DBNull

#TRUE# 又は #FALSE# True 又は False

#yyyy-mm-dd hh:mm:ss# 式に依り表された日付と時刻

#ERROR errornumber# errornumber(エラー値と仕て格納されたオブジェクト型)

Page 6: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-6-

データの入力中にファイルの末尾に達した場合は、入力が終了されてエラーが発生する。此れを防ぐに

は、ファイルの末尾に達すると True を返す EOF 関数を用いて、未だ未読込のデータが有るか何うかを

チェックする。

猶、Input 関数はローカライズされない。例えば、小数点にカンマ、桁区切りにドットを使用するドイ

ツ語バージョンでも、コンマは小数点ではなく、変数の区切り文字として扱われる為、3,14159 を読み

込むと 3 丈が返される。

Input 関数を試用してファイルからデータを読み込み、2 個の変数に代入する例を、下記に示す。此の

例のファイル TestFile.csv は、コードの最初の部分で作成し、1 行分のデータが "Hello", 234 の様に書

き込まれて居る。

FileOpen(1, " TestFile.csv ", OpenMode.Output)

Write(1, "hello")

WriteLine(1, 14)

FileClose(1)

Dim S As String = "teststring"

Dim I As Integer

FileOpen(1, " TestFile.csv ", OpenMode.Input)

Input(1, S): MsgBox(S)

Input(1, I): MsgBox(I)

FileClose(1)

■ シーケンシャルファイルから1行分のデータを読み込む LineInput 関数

シーケンシャル入力モードで開いたファイルから行全体を読み込み、文字列型(String)の変数に格納

するには、LineInput 関数を使用する。LineInput 関数の書式は、下記の通りで有る。

文字列型変数 = LineInput( ファイル番号 )

ファイル番号には、FileOpen 関数で指定したファイル番号を指定し、必ず指定する。

通常、LineInput 関数を使用して読み込んだデータは、Print 関数を使用して書き込む。

LineInput 関数は、キャリッジリターン(Chr(13))又は、キャリッジリターンとラインフィード(Chr(13)

+ Chr(10))が見付かる迄、ファイルから一度に 1 文字宛読み込む。猶、キャリッジリターンとライン

フィードは、文字列に追加されず、読み飛ばされる。

LineInput関数を使って、シーケンシャルファイルから 1 行宛読み込んで変数に代入する例を、下記に

示す。TestFile.csv は、複数行のサンプルデータを含むテキストファイルと仮定する。

Dim S As String

' ファイルのオープン

FileOpen(1, " TestFile.csv ", OpenMode.Input)

' ファイルの末尾迄読み込み

While Not EOF(1)

' 1 行分を読み込んで変数に格納

Page 7: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-7-

S = LineInput(1)

' 1 行分のデータの表示

MsgBox(TextLine)

End While

FileClose(1)

■ シーケンシャルファイルから指定した文字数丈のデータを読み込む InputString 関数

Input モード、又は、Binary モードで開いたファイルから指定した文字数の文字を読み込み、文字列型

(String)の変数に格納するには、InputString 関数を使用する。InputString 関数の書式は、下記の

通りで有る。

文字列型変数 = InputString( ファイル番号, 文字数 )

ファイル番号には、FileOpen 関数で指定したファイル番号を指定し、必ず指定する。

文字数には、読み込む文字数を指定し、必ず指定する。

通常、InputString 関数を使用して読み込んだデータは、Print 関数か FilePut 関数を使用してファイ

ルに書き込む。此の関数は、Input モード、又は、Binary モードで開いたファイルに対して丈、使用す

る事が出来る。

Input 関数と異なり、InputString 関数は、コンマ、キャリッジリターン、ラインフィード、二重引用

符、及び、先行空白を含む、読み込んだ総ての文字を返す。

Binary モードでファイルを開いた場合、InputString 関数を使用して、EOF 関数が True を返す迄ファ

イルを読み込もうとすると、エラーが発生する。InputString 関数を使用してバイナリファイルを読み

込む場合は、EOF関数の代わりにLOF関数やLoc関数を使用する。EOF関数を使用する場合は、FileGet

関数を使用する。

InputString 関数を使用して、ファイルから 1 文字宛読み込み、読み込んだ文字を Output ウィンドウ

に表示する例を、下記に示す。猶、下記の例で、MyFile.txt は、複数行のサンプルデータを含むテキス

トファイルと仮定する。

Dim C As String

' ファイルのオープン

FileOpen(1, " MyFile.txt ", OpenMode.Input)

' ファイルの末尾迄のループ

While Not EOF(1)

' 1 文字の取得

C = (InputString(1, 1))

' output ウィンドウに出力

System.Console.Out.WriteLine(C)

End While

FileClose(1)

■ シーケンシャルファイルに改行無しでデータを書き込む Print 関数

Page 8: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-8-

シーケンシャル出力モードで開いたファイルに改行無しでデータを書き込むには、Print 関数を使用す

る。Print 関数の書式は、下記の通りで有る。

Print( ファイル番号, 変数 [, 変数…] )

ファイル番号には、FileOpen 関数で指定したファイル番号を指定し、必ず指定する。

変数には、ファイルに書き込む値を格納した変数を指定し、省略可能で有る。複数の変数を指定する時は、カンマで

区切り、指定する。猶、変数以外にも、N 個の空白を出力する Spc(n)、出力位置を n 桁目に移動する Tab(n)、及び、

リテラルも指定する事が出来る。

通常、Print 関数を使用して書き込んだデータは、LineInput 又は Input 関数で読み込む。

複数の式をコンマで区切って指定するとタブ境界に合わせて配置されるが、コンマと TAB が混在して

居ると結果が乱れる可能性が有る。

ブール型(Boolean)のデータは、True か False と謂う文字列で出力される。キーワード True や False

は、ロケールに応じて翻訳される事は無い。

日付型のデータは、コントロールパネルで設定した短い形式で書き込まれる。日付や時間の構成要素が

無い場合やゼロの場合は、指定されて居る部分丈のデータがファイルに書き込まれる。

引数の変数のデータが空の場合は、ファイルには何も書き込まれない。但し、引数の変数のリストデー

タが DBNull の場合は、Null と謂う文字列がファイルに書き込まれる。

Error データは、文字列 Error errorcode と謂う形式で出力される。キーワード Error は、ロケールに

応じて翻訳される事は無い。

Print 関数を使用して書き込んだデータは、総て国別情報に対応して居る。書き込まれたデータは、適

切な小数点記号を使用して書式設定される。複数のロケールで使用出来る様にデータを出力するには

Write 関数を使用する。

■ シーケンシャルファイルに改行付きでデータを書き込む PrintLine 関数

シーケンシャル出力モードで開いたファイルに改行付きでデータを書き込むには、PrintLine 関数を使

用する。PrintLine 関数の書式は、下記の通りで有る。

PrintLine( ファイル番号, 変数 [, 変数…] )

ファイル番号には、FileOpen 関数で指定したファイル番号を指定し、必ず指定する。

変数には、ファイルに書き込む値を格納した変数を指定し、省略可能で有る。複数の変数を指定する時は、カンマで

区切り、指定する。猶、変数以外にも、N 個の空白を出力する Spc(n)、出力位置を n 桁目に移動する Tab(n)、及び、

リテラルも指定する事が出来る。

出力の末尾に改行を付加する以外は、Print 関数と同じで有る。

Print 関数と PrintLine 関数を使用して、データをファイルに書き込む例を、下記に示す。

Page 9: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-9-

FileOpen(1, "c:¥trash.txt", OpenMode.Output) ' 出力用ファイルのオープン

Print(1, "This is a test.") ' ファイルにテキストを出力

PrintLine(1) ' ファイルに空行を出力

PrintLine(1, "Zone 1", TAB(), "Zone 2") ' 2 個のゾーンを出力

PrintLine(1, "Hello", "World") ' タブで文字列を分割して出力

PrintLine(1, SPC(5), "5 leading spaces ") ' 先頭に 5 個の空白を付加して出力

PrintLine(1, TAB(10), "Hello") ' 10 桁目に単語を出力

' ブール型と日付型の設定

Dim aBool As Boolean = False

Dim aDate As DateTime = DateTime.Parse("February 12, 1969")

' ロケールに従い変換されたブール型と日付型のデータの出力

PrintLine(1, aBool, " is a Boolean value")

PrintLine(1, aDate, " is a date")

FileClose(1) ' ファイルのクローズ

※ Print 関数は、行末にラインフィードを含めないが、PrintLine 関数はラインフィードを含める。其

の為、PrintLine 関数の引数の変数を省略すると、空行がファイルに出力されるが、Print 関数で此

の引数を省略すると、何も出力されない。

■ シーケンシャルファイルに改行無しでデータを書き込む Write 関数

シーケンシャル出力モードで開いたファイルに改行無しでデータを書き込むには、Write 関数を使用す

る。Write 関数の書式は、下記の通りで有る。

Write( ファイル番号, 変数 [, 変数…] )

ファイル番号には、FileOpen 関数で指定したファイル番号を指定し、必ず指定する。

変数には、ファイルに書き込む値を格納した変数を指定し、省略可能で有る。複数の変数を指定する時は、カンマで

区切り、指定する。猶、変数以外にも、リテラルも指定する事が出来る。

通常、Write 関数を使用して書き込んだデータは、LineInput 又は Input 関数で読み込む。

引数の変数のデータが空の場合は、ファイルには何も書き込まれない。但し、引数の変数のリストデー

タが DBNull の場合は、Null と謂う文字列がファイルに書き込まれる。

Write 関数は、Print 関数と異なり、ファイルにデータを書き込む時に、データ項目の間にはコンマを

挿入し、文字列は引用符で囲む。引数の変数には、明示的に区切り文字を指定する必要は無い。

Write 関数を使用してデータをファイルに書き込む場合、サポートされるのは、数値、Boolean、日付、

null、Error のデータ形式而巳で有る。次の一般的な前提が適用されるので、ロケールに関係無く Input

関数を使用して、データを正しく読み取り、解釈する事が出来る。

・数値データ型のデータは、小数点記号と仕てピリオド( . )が常に使用される。

・ブール型(Boolean)のデータは、#TRUE# 又は #FALSE# と謂う文字列で出力される。キーワー

ド True と False は、ロケールに応じて翻訳される事は無い。

Page 10: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-10-

・日付型のデータは、共通日付形式を使用して書き込まれる。日付や時間の構成要素が無い場合やゼロ

の場合は、指定されて居る部分丈のデータがファイルに書き込まれる。

・引数の変数のデータが空の場合は、ファイルには何も書き込まれない。引数の変数のデータが NULL

の場合は、文字列 #NULL# がファイルに書き込まれる。

・エラーデータは、文字列 #ERROR errorcode# と謂う形式で出力される。キーワード Error は、ロ

ケールに応じて翻訳される事は無い。

猶、引用符を文字列に埋め込むには、二重の引用符( "" )を使用する。下記に例を示す。

Dim x As String = "Double quotation marks aren't ""difficult"" to handle."

■ シーケンシャルファイルに改行付きでデータを書き込む WriteLine 関数

シーケンシャル出力モードで開いたファイルに改行付きでデータを書き込むには、WriteLine 関数を使

用する。WriteLine 関数の書式は、下記の通りで有る。

WriteLine( ファイル番号, 変数 [, 変数…] )

ファイル番号には、FileOpen 関数で指定したファイル番号を指定し、必ず指定する。

変数には、ファイルに書き込む値を格納した変数を指定し、省略可能で有る。複数の変数を指定する時は、カンマで

区切り、指定する。猶、変数以外にも、リテラルも指定する事が出来る。

出力の末尾に改行を付加する以外は、Write 関数と同じで有る。

Write 関数と WriteLine 関数を使用して、データをファイルに書き込む例を、下記に示す。

FileOpen(1, "c:¥trash.txt", OpenMode.Output) ' 出力用ファイルのオープン

Write(1, "This is a test.") ' ファイルにテキストを出力

WriteLine(1) ' ファイルに空行を出力

WriteLine(1, "Zone 1", TAB(), "Zone 2") ' 2 個のゾーンを出力

WriteLine(1, "Hello", " ", "World") ' 空白で文字列を分割して出力

WriteLine(1, SPC(5), "5 leading spaces ") ' 先頭に 5 個の空白を付加して出力

WriteLine(1, TAB(10), "Hello") ' 10 桁目に単語を出力

' ブール型と日付型の設定

Dim aBool As Boolean = False

Dim aDate As DateTime = DateTime.Parse("February 12, 1969")

' ロケールに従い変換されたブール型と日付型のデータの出力

WriteLine(1, aBool, " is a Boolean value")

WriteLine(1, aDate, " is a date")

FileClose(1) ' ファイルのクローズ

■ ランダムファイルやバイナリファイルからデータを読み込む FileGet 関数

Random モード、又は、Binary モードで開いたファイルからデータを読み込み、変数に格納するには

FileGet 関数を使用する。FileGet 関数の書式は、下記の通りで有る。

Page 11: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-11-

FileGet( ファイル番号, 変数, レコード番号, 動的配列フラグ, 文字列フラグ )

ファイル番号には、FileOpen 関数で指定したファイル番号を指定し、必ず指定する。

変数には、読み込んだデータを格納する変数を指定し、必ず指定する。

レコード番号には、Random モードの場合、読み込みを始めるレコード番号を、亦、Binary モードの場合は、バイト

位置を指定し、省略可能で有る。

動的配列フラグには、配列を動的に処理するか何うか、及び、配列のサイズと境界を表す配列記述子が必要か何うか

を指定し、省略可能で有る(配列を書き込む場合丈に適用される)。

文字列フラグには、文字列の長さを表す 2 バイトの記述子を書き込むか何うかを指定し、省略可能で有る(文字列を

書き込む場合丈に適用される)。既定では False で有る。

FileGet 関数は、Random モードと Binary モードの場合丈に有効で有る。

通常、FileGet 関数を使用して読み込んだデータは、FilePut 関数を使用して書き込む。

ファイルの中で先頭のレコード番号、又は、バイト位置は 1 に成り、2 番目のレコード番号、又は、バ

イト位置は 2 に成る。引数のレコード番号を省略すると、最後に呼び出した FileGet 関数や FilePut 関

数、又は、最後に呼び出した Seek 関数が示す位置の次のレコード、又は、データが読み込まれる。

Random モード

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

・読み込むデータの長さが FileOpen 関数ステートメントの RecordLength 句で指定したレコード長よ

りも短ければ、FileGet 関数は、レコード長の終端から次のレコードを読み込む事が出来る。レコー

ドの終わりと次のレコードの先頭の間には、ファイルバッファの内容が埋め込まれる。埋め込まれる

データの量は正確に指定出来ない為、通常はレコード長を読み込むデータ長に合わせる。

・文字列変数を使う場合、FileGet 関数は、既定では文字列の長さを示す 2 バイトの記述子を読み込ん

でから、変数に格納するデータを読み込む。従って、FileOpen 関数のレコード長句では、文字列の

実際の長さより 2 バイト以上大きい値を指定する必要が有る。Visual Basic 6.0 以前のバージョンは

固定長文字列をサポートして居り、ファイルに書き込む場合、長さ記述子は書き込まれない。記述子

無しで文字列を読み込む場合は、引数の文字列フラグに True を指定する。此の場合は、読み込む文

字列の長さは正しい事が必要で有る。

・配列型の変数を使う場合は、配列のサイズと次元を表す記述子を読み込むか何うかを選択出来る。記

述子を書き込むには、引数の動的配列フラグ True に設定する。配列を読み取る場合は、配列の書き

込み方法に合わせる必要が有る。記述子を書き込む場合は、記述子を読み込む必要が有る。記述子を

使用しない場合は、FileGet 関数に渡される配列のサイズと境界に依り読み込む対象が決定する。

・記述子は、配列のランク、サイズ、及び、各ランクの最小値を指定する。長さは、2 に 8 と次元数の

積を加えた値(2 + 8 * 次元数)に成る。FileOpen 関数の引数のレコード長で指定するレコード長は、

データと配列の記述子を書き込む為に必要なバイト数の合計、又は、其れ以上で有る必要が有る。例

Page 12: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-12-

えば、次の配列を定義すると、配列がディスクに書き込まれる場合に 118 バイトが必要で有る。

Dim MyArray(4,9) As Integer

118 バイトは次の様に算出される。

・記述子に 18 バイト(2 + 8 * 2)

・データに 100 バイト(5 * 10 * 2)

・記述子は読み込まない。其の他の型の変数(可変長文字列変数とオブジェクト型の変数以外)を使う

場合、FileGet 関数は変数データだけを読み込む。FileOpen 関数のレコード長句では、読み込むデー

タの長さ以上の値を指定する必要が有る。

・構造体の要素を FileGet 関数を使って読み込む場合、各要素は独立して居る様に読み込まれる。但し

各要素の間には何も埋め込まれない。FilePut 関数を使用してユーザー定義型に含まれる動的配列を

ディスクに書き込むと、記述子が前置される。此の記述子の長さは、2 に 8 と次元数の積を加えた値

(2 + 8 * 次元数)に等しく成る。FileOpen 関数のレコード長句で指定するレコード長は、データと

配列の記述子を読み込む為に必要なバイト数の合計、又は、其れ以上で有る必要が有る。

VBFixedString 属性を構造体内の文字列フィールドに適用すると、ディスクに書き込む時に文字列の

サイズを示す事が出来る。

Binary モード

ファイルを Binary モードで開いた場合も、幾つかの例外を除いて Random モードと同じ規則が適用さ

れる。ファイルを Binary モードで開いた場合に適用される、Random モードとは異なる規則を次に示

す。

・FileOpen 関数のレコード長句は何もしない。FileGet は、総てのバイトデータをディスクから連続し

て読み込む。詰まり、レコードの間にデータを埋め込まない。

・構造体配列以外の配列の場合、FileGet 関数はデータ丈を読み込む。記述子は読み込まない。

・構造体の要素でない可変長文字列を使用する場合、FileGet 関数は、2 バイトの記述子を読み込まな

い。読み込まれるバイト数は、文字列内の文字数と同じで有る。

■ ランダムファイルやバイナリファイルにデータを書き込む FilePut 関数

Random モード、又は、Binary モードで開いたファイルにデータを書き込むには、FilePut 関数を使用

する。FilePut 関数の書式は、下記の通りで有る。

FilePut( ファイル番号, 変数, レコード番号, 動的配列フラグ, 文字列フラグ )

ファイル番号には、FileOpen 関数で指定したファイル番号を指定し、必ず指定する。

変数には、書き込むデータの値を格納して居る変数を指定し、必ず指定する。

レコード番号には、Random モードの場合、書き込みを始めるレコード番号を、亦、Binary モードの場合は、バイト

位置を指定し、省略可能で有る。

動的配列フラグには、配列を動的に処理するか何うか、及び、配列のサイズと境界を表す配列記述子が必要か何うか

を指定し、省略可能で有る(配列を書き込む場合丈に適用される)。

Page 13: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-13-

文字列フラグには、文字列の長さを表す 2 バイトの記述子を書き込むか何うかを指定し、省略可能で有る(文字列を

書き込む場合丈に適用される)。既定では False で有る。

FilePut 関数は、Random モードと Binary モードの場合丈に有効で有る。

通常、FilePut 関数を使用して書き込んだデータは FileGet 関数を使用して書き込む。

ファイルの中で先頭のレコード番号、又は、バイト位置は 1 に成り、2 番目のレコード番号、又は、バ

イト位置は 2 に成る。引数のレコード番号を省略すると、最後に呼び出した FileGet 関数や FilePut 関

数、又は、最後に呼び出した Seek 関数が示す位置の次のレコード、又は、データが読み込まれる。

引数の文字列フラグは、関数が文字列を可変長と固定長孰れで解釈するかを制御する。引数が True の

時、FilePut 関数は長さ記述子を書き込まない。FilePut 関数で引数の文字列フラグ= True を指定した

場合は、FileGet 関数でも同じ様に指定する必要が有る。亦、文字列が正しい長さに初期化されて居る

か何うかを確認する必要も有る。

Random モード

Random モードで開いたファイルの場合は、次の規則が適用される。

・書き込むデータの長さが FileOpen 関数のレコード長句で指定した長さを超えない限り、FilePut 関

数は次のレコードを直前のレコードの終端から書き込む。レコードの終わりと次のレコードの先頭の

間には、ファイルバッファの内容が埋め込まれる。埋め込まれるデータの量は指定出来ない為、通常

はレコード長を書き込むデータ長に合わせる。書き込むデータの長さが FileOpen 関数のレコード長

句で指定した長さを超えると、例外が発生する。

・可変長文字列変数を使う場合、FilePut 関数は文字列の長さを示す 2 バイトの記述子を書き込んでか

ら、変数にデータを書き込む。FileOpen 関数のレコード長句では、文字列の実際の長さより 2 バイ

ト以上大きい値を指定する必要が有る。

・書き込む変数が数値型を格納するオブジェクトで有る場合、FilePut 関数は、オブジェクトの VarType

を表す 2 バイトのデータを書き込み、次に変数のデータを書き込む。例えば、整数型を格納するオブ

ジェクトを書き込む場合、FilePut 関数は 6 バイトを書き込む。内訳は、VarType(3)(Integer)を示

す 2 バイトと、データを格納する 4 バイトで有る。FileOpen 関数のパラメータレコード長には、実

際にデータを格納する為に必要なバイト数より 2 バイト以上大きい値を指定する必要が有る。

・文字列を格納するオブジェクト型の変数を使う場合、FilePut 関数は、オブジェクトの VarType(8) を

示す 2バイトの記述子を書き込んでから、文字列の長さを示す 2バイトの記述子を書き込み、其の後、

文字列データを書き込む。FileOpen 関数のパラメータレコード長で指定するレコード長には、文字

列の実際の長さより 4 バイト以上大きい値を指定する必要が有る。記述子無しで文字列を書き込む場

合は、引数の文字列フラグに True を指定する。此の場合は、正しい長さの文字列を読み込む必要が

有る。

・配列型の変数を使う場合は、配列のサイズと次元を表す記述子を書き込むか何うかを選択出来る。

Visual Basic 6.0 以前のバージョンでは、動的配列にファイル記述子を書き込む。固定サイズの配列

には書き込まない。Visual Basic 2005 の既定設定では、記述子を書き込まない。記述子を書き込む

には、引数の動的配列フラグを True に設定する。配列を書き込む時は、配列の読み取り方法に合わ

Page 14: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-14-

せる必要が有る。記述子を使って読み取る場合は、記述子を書き込む必要が有る。記述子は、配列の

ランク、サイズ、及び、各ランクの最小値を指定する。長さが 2 + 次元の数 x 8 に等しい場合は(2 +

8 * 次元数)で有る。FileOpen 関数のレコード長句で指定するレコード長は、データと配列の記述子

を書き込む為に必要なバイト数の合計、又は、其れ以上で有る必要が有る。例えば、次の配列を定義

すると、配列がディスクに書き込まれる場合に 118 バイトが必要で有る。

Dim MyArray(4,9) As Integer

・其の他の型の変数(可変長文字列変数とオブジェクト型変数以外)を使う場合、FilePut 関数は、変

数のデータ丈を書き込む。FileOpen 関数のレコード長句では、書き込むデータの長さ以上の値を指

定する必要が有る。

・構造体の要素を FilePut 関数を使って書き込む場合、各要素は独立して居るかの様に書き込まれるが

各要素の間には何も埋め込まれない。VBFixedString 属性を構造体内の文字列フィールドに適用する

と、ディスクに書き込む時に文字列のサイズを示す事が出来る。

※ 文字列フィールドのバイト数が、VBFixedString 属性に指定した値よりも大きい場合は、ディスク

に書き込む時に文字列が切り取られる。

Binary モード

Binary モードで開かれて居るファイルでは、Random モードの規則の殆どが適用されるが、幾つか例

外が有る。Binary モードで開かれたファイルの次の規則は、Random モードの規則と異なる。

・FileOpen 関数のレコード長句は無効で有る。FilePut 関数は、総ての変数を連続して(レコードの間

にパディングを入れずに)ディスクに書き込む。

・構造体配列以外の配列の場合、FilePut 関数は、データ丈を書き込む。記述子は書き込まない。

・構造体の要素でない可変長文字列を使用する場合、FilePut 関数は、2 バイトの記述子を書き込まな

い。書き込まれるバイト数は、文字列内の文字数と同じで有る。例えば、次のステートメントは、フ

ァイル番号 1 のファイルに 11 バイトのデータを書き込む。

Dim hellow As String = "Hello World"

FilePut(1,hellow)

・FilePut 関数を使用してファイルにデータを書き込むには、FileIOPermissionAccess 列挙体からの

Write アクセスが必要で有る。

使用例

FilePut 関数を使用して、データをファイルに書き込む例を、下記に示す。此の例では、構造体 Person

の 5 つのレコードをファイルに書き込む。

Structure Person

Public ID As Integer

Public Name As String

End Structure

Sub WriteData()

Dim PatientRecord As Person

Page 15: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-15-

Dim recordNumber As Integer

' ランダムアクセスモードでファイルのオープン

FileOpen(1, "C:¥TestFile.txt", OpenMode.Binary)

' 5 回のループ

For recordNumber = 1 To 5

' ID の定義.

PatientRecord.ID = recordNumber

' 文字列の生成

PatientRecord.Name = "Name " & recordNumber

' レコードの書込

FilePut(1, PatientRecord)

Next recordNumber

FileClose(1)

End Sub

■ ファイルの長さを取得する FileLen 関数

ファイルの長さをバイト単位で示す長整数型(Long)の値を取得するには、FileLen 関数を使用する。

FileLen 関数の書式は、下記の通りで有る。

FileLen( ファイル名 )

ファイル名には、ファイル名を指定する文字列式を指定し、必ず指定する。猶、ディレクトリ名、フォルダ名、ドラ

イブ名も含めて指定する事が出来る。

指定したファイルが、FileLen 関数の呼出時に開いて居た場合は、ファイルが開かれた時点でのファイ

ルのサイズを表す値を返す。

※ 開いて居るファイルの現在の長さを取得するには、LOF 関数を使用する。

FileLen 関数を使用して、ファイルの長さをバイト単位で取得するコード例を、下記に示す。此の例で

は、TestFile.txt はデータを含むファイルで有ると仮定する。

Dim MySize As Long = FileLen("TestFile.txt")

■ 開いて居るファイルの長さを取得する LOF 関数

FileOpen 関数を使用して開いたファイルのバイト単位のサイズを表す長整数型(Long)の値を取得す

るには、LOF 関数を使用する。LOF 関数の書式は、下記の通りで有る。

長整数型変数 = LOF( ファイル番号 )

ファイル番号には、FileOpen 関数で指定したファイル番号を指定し、必ず指定する。

※ 開いて居ないファイルのサイズを取得するには、FileLen 関数を使用する。

LOF 関数を使用して、開いたファイルのサイズを調べる例を、下記に示す。ファイル TestFile.txt は、

サンプルデータを含むテキストファイルと仮定する。

FileOpen(1, "C:¥TestFile.txt", OpenMode.Input)

Dim length As Long = LOF(1): MsgBox(length)

FileClose(1)

Page 16: ファイル操作junko036.html.xdomain.jp › school › advance › ref › vb04b.pdf' Test for normal. If (MyAttr And FileAttribute.Normal) = FileAttribute.Normal Then MsgBox("This

VS 2005 資料 【電脳梁山泊 烏賊塾】

-16-

■ VBFixedStringAttribute クラスの利用 ■

■ Microsoft.VisualBasic.VBFixedStringAttribute クラス

Visual Basic の文字列は、既定では可変長で有る。固定長文字列を必要とする Visual Basic のファイル

入出力関数(FileGet 関数や FilePut 関数等)を使う時には、此の属性を使用する。

※ VBFixedStringAttribute 属性は、文字列の長さを文字数ではなく、バイト数で指定する。

VBFixedStringAttribute 属性を使用した構造体の宣言の使用例を、下記に示す。

Structure Person

Public ID As Integer

Public MonthlySalary As Decimal

Public LastReviewDate As Long

<VBFixedString(15)> Public FirstName As String

<VBFixedString(15)> Public LastName As String

<VBFixedString(15)> Public Title As String

<VBFixedString(150)> Public ReviewComments As String

End Structure

※ VBFixedStringAttribute は情報提供の為の属性で、可変長の文字列を固定長の文字列に変換する為

には使用出来ない。此の属性の目的は、構造体や非ローカル変数に含まれる文字列に付いての

VBFixedStringAttribute を認識するメソッドや API(Len 関数や FilePut 関数等)の呼出での使用

方法を変更する事に有る。此の属性に依り、文字列自身の実際の長さが変更される事はない点に注

意を要する。

VBFixedStringAttribute 属性を使用した構造体を使用した使用例を、下記に示す。

Structure Book

<VBFixedArray(4)> Public Chapter( ) As Integer

End Structure

Sub WriteData( )

Dim FileNum As Integer = FreeFile()

Dim MyBook As Book

ReDim MyBook.Chapter(4)

MyBook.Chapter(0) = 1

MyBook.Chapter(1) = 2

MyBook.Chapter(2) = 3

MyBook.Chapter(3) = 4

MyBook.Chapter(4) = 5

FileOpen(FileNum, "C:¥testfile", OpenMode.Binary, OpenAccess.Write, OpenShare.Default)

FilePut(FileNum, MyBook)

FileClose(FileNum)

End Sub

※ VBFixedArrayAttribute は情報提供の為の属性で、ストレージを割り当てない。此の属性の目的は

構造体や非ローカル変数に含まれる配列に付いての、VBFixedArrayAttribute を認識するメソッド

や API 呼出での使用方法を変更する事に有る。此の属性に依り、可変長の配列が固定長の配列に変

換される事は無く、Dim ステートメントや ReDim ステートメントで配列のストレージを割り当て

る必要が残って居る事に注意を要する。