How to Read and Write Visual Basic Arrays to DiskID: Q77317
|
Microsoft Visual Basic for Windows does not provide a command to read or write an entire array all at once to a disk file. Using Visual Basic for Windows alone, you must transfer each element of the array to the disk. However, using two Windows API functions, _lread and _lwrite, you can save an entire array to disk in one statement when the array is less then 64K.
The ReadArray and WriteArray functions provided below allow you to
read and write a Visual Basic for Windows array to or from a disk file.
These functions will work with arrays of Integers, Longs, Singles,
Doubles, Currency, and user-defined types, but not with
variable-length strings (as an array or as a member of a user-defined
type) or variants. These functions can work with fixed length strings
when the strings are a member of a user-defined type. Arrays greater
than 64K are supported in Visual Basic versions 2.0 and later for
Windows, however the _lread and _lwrite functions can only handle
arrays up to 64K. Arrays greater than 64K can be written to disk using
the standard I/O statements built into Visual Basic for Windows.
The two functions, ReadArray and WriteArray, require two parameters:
the array to be transferred, and the Visual Basic for Windows file
number to be written to or read from. The functions also return the
number of bytes transferred, or -1 when an error occurs with the API
function. The file number is the Visual Basic for Windows file number
of a file that has already been opened with the Open statement, and
will be used in the Visual Basic for Windows Close statement.
The following function examples use a user-defined type named "Mytype".
An example of this type is as follows:
Type MyType
Field1 As String * 10
Field2 As Integer
Field3 As Long
Field4 As Single
Field5 As Double
Field6 As Currency
End Type
DefInt A-Z
' Each Declare statement must appear on one line:
Declare Function fWrite Lib "kernel" Alias "_lwrite" (ByVal hFile,
lpBuff As Any, ByVal wBytes)
Declare Function fRead Lib "kernel" Alias "_lread" (ByVal hFile,
lpBuff As Any, ByVal wBytes)
Function ReadArray (An_Array() As MyType, VBFileNumber As Integer) As Long
Dim ApiErr As Integer
Dim ArraySize As Long
Dim DOSFileHandle As Integer
Dim ReadFromDisk As Integer
ArraySize = Abs(UBound(An_Array) - LBound(An_Array)) + 1
ArraySize = ArraySize * Len(An_Array(LBound(An_Array)))
If ArraySize > 32767 Then
ReadFromDisk = ArraySize - 2 ^ 15
ReadFromDisk = ReadFromDisk * -1
Else
ReadFromDisk = ArraySize
End If
DOSFileHandle = FileAttr(VBFileNumber, 2)
ApiErr=fRead(DOSFileHandle,An_Array(LBound(An_Array)),ReadFromDisk)
ReadArray = ApiErr
End Function
Function WriteArray (An_Array() As MyType, VBFileNumber As Integer) As Long
Dim ApiErr As Integer
Dim ArraySize As Long
Dim DOSFileHandle As Integer
Dim WriteToDisk As Integer
ArraySize = UBound(An_Array) - LBound(An_Array) + 1
ArraySize = ArraySize * Len(An_Array(LBound(An_Array)))
If ArraySize > 32767 Then
WriteToDisk = ArraySize - 2 ^ 15
WriteToDisk = WriteToDisk * -1
Else
WriteToDisk = ArraySize
End If
DOSFileHandle = FileAttr(VBFileNumber, 2)
ApiErr=fWrite(DOSFileHandle,An_Array(LBound(An_Array)),WriteToDisk)
WriteArray = ApiErr
End Function
Function ReadArray (An_Array() As Integer, VBFileNumber As Integer)
As Long
Function WriteArray (An_Array() As Integer, VBFileNumber As Integer)
As Long
Function ReadArray (An_Array() As Long, VBFileNumber As Integer) As
Long
Function WriteArray (An_Array() As Long, VBFileNumber As Integer) As
Long
Function ReadArray (An_Array() As Single, VBFileNumber As Integer) As
Long
Function WriteArray (An_Array() As Single, VBFileNumber As Integer) As
Long
Function ReadArray (An_Array() As Double, VBFileNumber As Integer) As
Long
Function WriteArray (An_Array() As Double, VBFileNumber As Integer) As
Long
Function ReadArray (An_Array() As Currency, VBFileNumber As Integer)
As Long
Function WriteArray (An_Array() As Currency, VBFileNumber As Integer)
As Long
Keywords : kbcode
Version : 1.0 2.0 3.0
Platform : WINDOWS
Issue type : kbhowto
Last Reviewed: June 10, 1999