テキストファイルの読込表示
                                                         玄関へお回り下さい。
テキストファイルの読込表示比較             (161)
使用する前に、[プロジェクト]→[参照設定]で Microsoft Scripting Runtime の参照にチェックを入
れておいて下さい。
そして Form に CommandButton3個Label1個とRichTextBoxを1個貼り付けておいて下さい。
  Option Explicit   'SampleNo=161 WindowsXP VB6.0(SP5) 2002.07.03
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private TxtFile As String


Private Sub Form_Load()
  ’別途テキストファイルを用意しておいて下さい。
  TxtFile = App.Path & "\Test.Txt"
End Sub


Private Sub Command1_Click()
  Label1.Caption = ""
  RichTextBox1.Text = ""
  DoEvents
  fTimeCount
  Dim Fso  As New FileSystemObject
  Dim FsoTS As TextStream
  Set FsoTS = Fso.OpenTextFile(TxtFile)
  'ファイル全体を読み込みテキストボックスに表示
  RichTextBox1.Text = FsoTS.ReadAll
  'オープンしていたファイルを閉じる
  FsoTS.Close
  Set FsoTS = Nothing
  DoEvents
  Label1.Caption = fTimeCount
End Sub

'====================以下参考===============================

Private Sub Command2_Click()
'Line Input # ステートメントを使っての1行づつ読込
'時間が非常に掛かるので注意
  RichTextBox1.Text = ""
  Label1.Caption = ""
  DoEvents
  fTimeCount
  Dim TxtLine  As String
  Dim MyString As String
  Dim lngFileNo As Long
  lngFileNo = FreeFile
  Open TxtFile For Input As #lngFileNo
  Do Until EOF(lngFileNo)
    Line Input #lngFileNo, TxtLine
    MyString = MyString & TxtLine & vbCrLf
  Loop
  Close #lngFileNo
  RichTextBox1.Text = MyString
  DoEvents
  Label1.Caption = fTimeCount
End Sub


Private Sub Command3_Click()
'テキストファイルをバイナリデータとして読込表示する
  RichTextBox1.Text = ""
  Label1.Caption = ""
  DoEvents
  fTimeCount
  Dim bytArray() As Byte
  Dim intFileNo  As Integer
  Dim lngFileLenB As Long
  lngFileLenB = FileLen(TxtFile)
  ReDim bytArray(lngFileLenB - 1)
  '使用可能なファイル番号を取得する
  intFileNo = FreeFile
  'ファイルをバイナリモードで開く
  Open TxtFile For Binary As #intFileNo
  'バイナリデータとして読込んで
  Get #intFileNo, , bytArray
  Close #intFileNo
  'Unicodeに変換して表示
  RichTextBox1.Text = StrConv(bytArray, vbUnicode)
  Label1.Caption = fTimeCount
End Sub


Private Function fTimeCount() As String
  Static lngST As Long
  If lngST = 0& Then
    lngST = timeGetTime
  Else
    fTimeCount = "経過時間=" & _
           Str$((timeGetTime - lngST) / 1000) & " 秒です"

    lngST = 0&
  End If
End Function

 
FileSystemObjectを使ってテキストファイルを読込むからには何かメリットがなければ使
う意味が無いので、読込速度を比較して見ました。
その他 Input # ステートメント を使って読込めば結構高速に読込めるのですが、文中に ”” 等が
使用されているとそれ以降は読込めないので、Line Input を使った読込比較を行っております。

比較結果 約1Mの掲示板のログのテキストファイルを使用

FileSystemObject の場合  約 2.67秒
Line Input の場合         約10分(フリーズしたとカン違いしないように)
バイナリの場合          約 2.63秒

上記の結果シンプルなコードで高速にファイル読込ができる事が解って頂けるかと思います。
   
お断り
Line Inputが遅いのではなく、MyString = MyString & TxtLine & vbCrLf の処理が遅いだけだと言ったような、ご指摘を受ける事があるのですが、上記コード比較は、ファイルの読み込み処理速度の比較を目的に書いたものではありません。
FileSystemObject の紹介の一環としてファイルの通常の読み込み操作の比較をしたものです。
従って、このようにすればファイルが高速に読み込みできると言った事を説明しているものではありませんので誤解なきように、尚、ファイルの高速読み込み等はその使用条件・環境・個人の考え方等々で色々違ってくるので、その場面、場面で考える必要があるかと思います。 (参考 文字列連結の高速化 - まんたろー 06/10-19:11 No.9220

たとへば、数行程度のファイルならどのような読み込み操作でも使用している人には遅い、早いの区別はできないでしょう。コード上で測定しても多分優劣が付かないのでは(測定誤差範囲内では)






2005/02/22