連載
プロフェッショナルVB.NETプログラミング
第7回 ファイル入出力(前編)
(株)ピーデー
川俣 晶
2002/05/30
|
|
ファイル・システム・オブジェクトを用いたテキスト・ファイルの入出力
WSH(Windows Scriptiong Host)などでVBS(Visual Basic Script)プログラミングしている場合、伝統的なファイル入出力ステートメントは使用できず、その代わり、ファイル・システム・オブジェクトが提供される。これはフルセットのVB 6でも利用できるもので、より新しい世代のファイル・アクセス手段といえる。前のサンプル・ソースとほぼ同じ内容をファイル・システム・オブジェクトを用いて書き換えてみたのが以下のサンプル・ソースである。
1: Private Sub Form_Load()
2: Dim fs As Object, wfile As Object, rfile As Object
3: Set fs = CreateObject("Scripting.FileSystemObject")
4: Set wfile = fs.CreateTextFile("c:\test.txt", True)
5: wfile.Write "Test"
6: wfile.WriteLine " Data"
7: wfile.WriteLine "テストデータ"
8: wfile.Write "ファイル番号は"
9: wfile.WriteLine "使用していません"
10: wfile.WriteLine "A" & Space(1) & "B" & Space(5) & "C"
11: wfile.WriteLine True & "," & False
12: wfile.WriteLine Date
13: wfile.Close
14:
15: Const ForReading = 1
16: Set rfile = fs.OpenTextFile("c:\test.txt", ForReading)
17: Dim s As String
18: While Not rfile.AtEndOfStream
19: s = rfile.ReadLine
20: Debug.Print s
21: Wend
22: rfile.Close
23: End Sub
|
|
ファイル・システム・オブジェクトを用いてサンプル・プログラム1を書き換えたVB 6のサンプル・プログラム3 |
これを実行すると以下のようになる。
1: Test Data
2: テストデータ
3: ファイル番号は使用していません
4: A B C
5: True,False
6: 2002/04/25
|
|
サンプル・プログラム3の実行結果 |
ファイル・システム・オブジェクトには、Writeステートメントに相当するものはない。また、書式を整える機能も持っておらず、出力前に文字列として書式を整えておかねばならない。当然、10行目に見られる2番目のSpace()は、TAB()と等価ではない。
次に、このソースをVB.NETで動くようにしてみよう。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim fs As Object, wfile As Object, rfile As Object
3: fs = CreateObject("Scripting.FileSystemObject")
4: wfile = fs.CreateTextFile("c:\test.txt", True)
5: wfile.Write("Test")
6: wfile.WriteLine(" Data")
7: wfile.WriteLine("テストデータ")
8: wfile.Write("ファイル番号は")
9: wfile.WriteLine("使用していません")
10: wfile.WriteLine("A" & Space(1) & "B" & Space(5) & "C")
11: wfile.WriteLine(True & "," & False)
12: wfile.WriteLine(Today)
13: wfile.Close()
14:
15: Const ForReading = 1
16: rfile = fs.OpenTextFile("c:\test.txt", ForReading)
17: Dim s As String
18: While Not rfile.AtEndOfStream
19: s = rfile.ReadLine
20: Trace.WriteLine(s)
21: End While
22: rfile.Close()
23: End Sub
|
|
サンプル・プログラム3をVB.NETで書き換えたサンプル・プログラム4 |
これを実行すると以下のようになる。
1: Test Data
2: テストデータ
3: ファイル番号は使用していません
4: A B C
5: True,False
6: 2002/04/25
|
|
サンプル・プログラム4の実行結果 |
見てのとおり、基本的にはほとんど変更なく利用できることが分かると思う。これは、ファイル・システム・オブジェクトがVBという言語の外側に存在するオブジェクトであるため、VBのバージョンの違いによる影響を受けにくいためである。
しかし、微妙な相違があることに注意が必要だ。まずソース3行目などのオブジェクトの参照への代入で、setキーワードが不要になったことを確認していただきたい。VB.NETではオブジェクトの参照を代入する場合、setキーワードは不要になった。また、Closeメソッドの後ろに括弧が必要になっている。VB.NETではメソッド呼び出し時に括弧を付ける必要がある。
参照を使ったファイル・システム・オブジェクトの利用
ファイル・システム・オブジェクトは、CreateObject関数を用いる方法のほか、VB 6ではプロジェクトに参照を追加する方法でも使うことができる。“Microsoft Scripting Runtime”を参照に追加した状態で、以下のサンプル・ソースは実行できる。
1: Private Sub Form_Load()
2: Dim fs As Scripting.FileSystemObject
3: Dim rfile As Scripting.TextStream, wfile As Scripting.TextStream
4: Set fs = New Scripting.FileSystemObject
5: Set wfile = fs.CreateTextFile("c:\test.txt", True)
6: wfile.Write "Test"
7: wfile.WriteLine " Data"
8: wfile.WriteLine "テストデータ"
9: wfile.Write "ファイル番号は"
10: wfile.WriteLine "使用していません"
11: wfile.WriteLine "A" & Space(1) & "B" & Space(5) & "C"
12: wfile.WriteLine True & "," & False
13: wfile.WriteLine Today
14: wfile.Close
15:
16: Set rfile = fs.OpenTextFile("c:\test.txt", Scripting.IOMode.ForReading)
17: Dim s As String
18: While Not rfile.AtEndOfStream
19: s = rfile.ReadLine
20: Debug.Print s
21: Wend
22: rfile.Close
23: End Sub
|
|
プロジェクトの参照追加により、ファイル・システム・オブジェクトを利用したVB 6のサンプル・プログラム5 |
これを実行すると以下のようになる。
1: Test Data
2: テストデータ
3: ファイル番号は使用していません
4: A B C
5: True,False
|
|
サンプル・プログラム5の実行結果 |
さて、これと同じことをVB.NETでやろうとすると、少々手順が違うので説明しよう。まず、[プロジェクト]のメニューから[参照の追加]を選ぶ。そして、[参照の追加]ダイアログ・ボックスで、[COM]タブを選ぶ。VB.NETでは参照する対象がCOMオブジェクト以外にも存在するので、必ず[COM]を選ばなければならない。そして、リストから“Microsoft Scripting Runtime”を探す。発見したら、[選択]ボタンを押す。
|
[参照の追加]ダイアログ・ボックス |
VB.NETでファイル・システム・オブジェクトを使用するためには、まずこのダイアログより“Microsoft Scripting Runtime”を参照追加する。
|
そして、ダイアログ・ボックス下部の[選択されたコンポーネント]のリストに、選択した名前が確かにあることを確認してから[OK]ボタンを押す。
確かに参照が追加されたかどうかを確認するには、オブジェクト・ブラウザを使用する。
|
オブジェクト・ブラウザの表示 |
オブジェクト・ブラウザは、[表示]-[その他のウィンドウ]-[オブジェクト・ブラウザ]で表示することが出来る。
|
上記のようにInterop.Scriptingという参照が見つかれば、確かに追加されている。
この参照を用いてVB.NETで実行可能なソースを記述したものが下記である。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim fs As Scripting.FileSystemObject
3: Dim rfile As Scripting.TextStream, wfile As Scripting.TextStream
4: fs = New Scripting.FileSystemObject()
5: wfile = fs.CreateTextFile("c:\test.txt", True)
6: wfile.Write("Test")
7: wfile.WriteLine(" Data")
8: wfile.WriteLine("テストデータ")
9: wfile.Write("ファイル番号は")
10: wfile.WriteLine("使用していません")
11: wfile.WriteLine("A" & Space(1) & "B" & Space(5) & "C")
12: wfile.WriteLine(True & "," & False)
13: wfile.WriteLine(Today)
14: wfile.Close()
15:
16: rfile = fs.OpenTextFile("c:\test.txt", Scripting.IOMode.ForReading)
17: Dim s As String
18: While Not rfile.AtEndOfStream
19: s = rfile.ReadLine
20: Trace.WriteLine(s)
21: End While
22: rfile.Close()
23: End Sub
|
|
ファイル・システム・オブジェクトを利用したVB.NETのサンプル・プログラム6 |
これを実行すると以下のようになる。
1: Test Data
2: テストデータ
3: ファイル番号は使用していません
4: A B C
5: True,False
6: 2002/04/25
|
|
サンプル・プログラム6の実行結果 |
見てのとおり、これもほとんど同じソースであることが分かると思う。すでに説明済みの小さな相違を別にすれば、ほとんど同じようにソースを記述できるといえる。しかし、見た目はそっくりでも、油断はできない。というのは、実行ファイルが生成されるディレクトリを見ると分かるのだが、「Interop.Scripting.dll」というファイルが生成されている。これは、指定したCOMオブジェクト(ファイル・システム・オブジェクトを含むモジュール)のラッパー・クラス(Wrapper Class)である。VB 6では、直接COMオブジェクトにアクセスしていたが、VB.NETではこのラッパー・クラスを経由して、COMオブジェクトにアクセスしているのである。
なお、CreateObjectを使用した場合はまた状況が変わる。この場合、COMオブジェクトへのアクセスは実行時に処理されるので、ラッパー・オブジェクトのDLLファイルは生成されない。
Insider.NET 記事ランキング
本日
月間