How to Read and Write Visual Basic Arrays to Disk

Last reviewed: August 12, 1997
Article ID: Q77317

The information in this article applies to:

- Standard and Professional Editions of Microsoft Visual Basic for

  Windows, versions 2.0 and 3.0
- Microsoft Visual Basic programming system for Windows, version 1.0

SUMMARY

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.

MORE INFORMATION

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

Declarations of API Functions

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

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

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

The following are the function header changes to allow the ReadArray and WriteArray functions to work with different data types (Integer, Long, Single, Double, Currency, and user-defined type). Each Function statement must be on a single line:

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          : APrgDataOther kbhowto kbtlc
Version           : 1.0 2.0 3.0
Platform          : WINDOWS
Issue type        : kbhowto
Solution Type     : kbcode


================================================================================


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: August 12, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.