連載

プロフェッショナルVB.NETプログラミング

第7回 ファイル入出力(前編)

(株)ピーデー
川俣 晶
2002/05/30

Page1 Page2 Page3

ファイル・システム・オブジェクトを用いたテキスト・ファイルの入出力

 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ファイルは生成されない。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第7回 ファイル入出力(前編)
    1.ステートメントを用いたテキスト・ファイルの入出力
  2.ファイル・システム・オブジェクトを用いたテキスト・ファイルの入出力
    3.VB専用ファイル入出力関数とファイル・システム・オブジェクト
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間