私はVB.Netでそれを行う方法を知っていますが、vb6のアイデアではありません.
私が達成すべきことは、ファイル全体を読み取らないようにすることです。
それは可能ですか?
3 に答える
ランダム アクセスを使用してファイルを開くことができます。キャリッジ リターンとライン フィードの文字ペアの数を数えながら、一度に 1 バイトずつ逆方向に作業します。各行を配列などに格納し、400 行を読み終えたら停止します。
コメットビルは良い答えを持っています。
ランダム アクセス用にファイルを開くには:
Open filename For Random Access Read As #filenumber Len = reclength
ファイルの長さをバイト単位で取得するには:
FileLen(ByVal PathName As String) As Long
ランダム アクセス ファイルから読み取るには:
Get [#]filenumber,<[recnumber]>,<varname>
重要:関数の<varname>
from はGet
固定長の文字列である必要があります。そうしないと、変数がこのように可変長の文字列として宣言されている場合Dim varname as String * 1
にエラーが発生しますBad record length (Error 59)
Dim varname as String
編集:
Dim varname as String * 1
固定長の文字列を定義していて、長さが 1 であることを指摘しておきたいと思います。これは、read-1-byte-backwards アプローチを使用する場合です。ファイルに固定長のレコードがある場合、一度に 1 バイトずつ移動する必要はありません。一度に 1 レコードずつ読み取ることができます (キャリッジ リターンと改行のために 2 バイトを追加することを忘れないでください)。後者の場合、Dim varname as String * X
X がレコード長 + 2 であると定義します。次に、400 回逆方向に、またはファイルの先頭に到達するまで単純なループを実行します。
以下は、これに対する私の見解です。ファイル全体をメモリに保存する必要がないため、ファイルが非常に大きい場合、これは前の 2 つの回答よりも効率的です。
Option Explicit
Private Sub Command_Click()
Dim asLines() As String
asLines() = LoadLastLinesInFile("C:\Program Files (x86)\VMware\VMware Workstation\open_source_licenses.txt", 400)
End Sub
Private Function LoadLastLinesInFile(ByRef the_sFileName As String, ByVal the_nLineCount As Long) As String()
Dim nFileNo As Integer
Dim asLines() As String
Dim asLinesCopy() As String
Dim bBufferWrapped As Boolean
Dim nLineNo As Long
Dim nLastLineNo As Long
Dim nNewLineNo As Long
Dim nErrNumber As Long
Dim sErrSource As String
Dim sErrDescription As String
On Error GoTo ErrorHandler
nFileNo = FreeFile
Open the_sFileName For Input As #nFileNo
On Error GoTo ErrorHandler_FileOpened
' Size our buffer to the number of specified lines.
ReDim asLines(0 To the_nLineCount - 1)
nLineNo = 0
' Read all lines until the end of the file.
Do Until EOF(nFileNo)
Line Input #nFileNo, asLines(nLineNo)
nLineNo = nLineNo + 1
' Check to see whether we have got to the end of the string array.
If nLineNo = the_nLineCount Then
' In which case, flag that we did so, and wrap back to the beginning.
bBufferWrapped = True
nLineNo = 0
End If
Loop
Close nFileNo
On Error GoTo ErrorHandler
' Were there more lines than we had array space?
If bBufferWrapped Then
' Create a new string array, and copy the bottom section of the previous array into it, followed
' by the top of the previous array.
ReDim asLinesCopy(0 To the_nLineCount - 1)
nLastLineNo = nLineNo
nNewLineNo = 0
For nLineNo = nLastLineNo + 1 To the_nLineCount - 1
asLinesCopy(nNewLineNo) = asLines(nLineNo)
nNewLineNo = nNewLineNo + 1
Next nLineNo
For nLineNo = 0 To nLastLineNo
asLinesCopy(nNewLineNo) = asLines(nLineNo)
nNewLineNo = nNewLineNo + 1
Next nLineNo
' Return the new array.
LoadLastLinesInFile = asLinesCopy()
Else
' Simply resize down the array, and return it.
ReDim Preserve asLines(0 To nLineNo)
LoadLastLinesInFile = asLines()
End If
Exit Function
ErrorHandler_FileOpened:
' If an error occurred whilst reading the file, we must ensure that the file is closed
' before reraising the error. We have to backup and restore the error object.
nErrNumber = Err.Number
sErrSource = Err.Source
sErrDescription = Err.Description
Close #nFileNo
Err.Raise nErrNumber, sErrSource, sErrDescription
ErrorHandler:
Err.Raise Err.Number, Err.Source, Err.Description
End Function