Access

  MS Access 2010+  |  Przetwarzanie plików  |   VBA 7.0



• Jak pobrać plik lub jego fragment do tablicy typu Byte.

Aby odczytać dane z pliku możemy pobrać jednorazowo jego całą zawartość do zmiennej typu String lub tablicy bajtów, możemy pobrać fragment pliku do zmiennej typu String lub tablicy bajtów, a także pobierać porcjami kolejne linie , lub kolejne „rekordy” do zmiennej „Typ użytkownika”.

Funkcja sprawdzająca argumenty otwarcia pliku.

Na stronie Walidacja argumentów otwarcia pliku przedstawiłem funkcję plikCheckArguments(...) sprawdzającą poprawnośc argumentów funkcji operujących na plikach tekstowych i binarnych. Nie jest to idealna funkcja uwzględniająca wszystkie przypadki nieprawidłowego otwarcia pliku, ale w większości przypadków umożliwia wychwycenie błędów podczas próby otwarcia pliku w trybie do „Do odczytu” lub „Do zapisu”.

• Jak odczytać dane z pliku do tablicy typu Byte.

Odpowiedź jest bardzo prosta. W bardzo podobny sposób jak w przedstawionej wcześniej funkcji plikFileToString(...) na stronie „Plik do zmiennej String”. Należy tylko w funkcji plikFileToString(...) zamienić argument sRetString As String na tablicę arrRetBytes() As Byte i to wszystko. No jeszcze troszkę inaczej należy przygotować bufor na przyjęcie danych:

ReDim arrRetBytes(0 To lBytes - 1)
' zamiast
sRetString = String(lBytes, vbNullChar)

Funkcja sprawdzająca argumenty otwarcia pliku.

Aby sprawdzić argumenty otwarcia pliku skorzystamy z tej samej funkcji plikCheckArguments(...) sprawdzającą poprawnośc argumentów funkcji operujących na plikach tekstowych i binarnych, która umożliwia wychwycenie błędów podczas próby otwarcia pliku w trybie do „Do odczytu” lub „Do zapisu”.

⊗ Public Function plikFileToArray( _
                      ByVal sFilePath As String, _
                      ByRef arrRetBytes() As Byte, _
              Optional ByVal lStart As Long = 1, _
              Optional ByVal lBytes As Long = -1) As Long
  • Funkcja plikFileToArray (...) otwiera plik w trybie „Do odczytu” i pobiera określoną ilość bajtów lBytes, począwszy od startowego bajtu lStart. Zwraca ilość pobranych bajtów, a w argumencie ByRef arrRetBytes() As Byte zwraca tablicę zawierającą pobrane bajty.
  • argumenty:
    • sFilePath
    • pełna ścieżka do pliku, plik musi istnieć i nie może być otwarty na wyłączność.
    • arrRetBytes()
    • przekazywana ByRef tablica typu Byte, w której zwracane są pobrane bajty. Przy niepowodzeniu wywołania funkcji zwracana tablica jest niezainicjowana.
    • lStart
    • numer bajtu od którego ma nastąpić odczyt, domyślnie = 1. Jeżeli numer bajtu początkowego lStart jest większy niż długość pliku lLenFile generowany jest błąd wykonania o numerze errOutOfRange = vbObjectError + err_plikError + 4, (err_plikError = 100), funkcja zwraca -1, a zwracanaByRef tablica  arrRetBytes() jest niezainicjowana.
    • lBytes
    • ilość bajtów do pobrania, dla domyślnej wartości -1 pobierane są wszystkie bajty począwszy od bajtu startowego lStart. Jeżeli ilość bajtów do pobrania przekracza ilość dostępnych bajtów, funkcja zwraca wszystkie bajty począwszy od bajtu lStart aż do końca pliku.
  • zwraca:
  • Przy powodzeniu zwraca wartość ilość pobranych bajtów,a w argumencie ByRef arrRetBytes() zwraca pobrane bajty. Przy niepowodzeniu zwraca -1, a zwracanaByRef tablica  arrRetBytes() jest niezainicjowana.
    Jeżeli plik nie zawiera danych (jest pusty) funkcja zwraca 0, a zwracanaByRef tablica  arrRetBytes() jest niezainicjowana.
  • autor: Zbigniew Bratko
  • data: 15.01.2018

  • Uwaga.
    Funkcja plikFileToArray(...) korzysta z pomocniczej funkcji plikCheckArguments(...) sprawdzającej poprawność argumentów.
Option Compare Database
Option Explicit

'dolna granica zakresu numerów błędów dotyczących plików
Public Const err_plikError          As Long = 100

' Numer początkowy bajtu (znaku, linii) jest poza zakresem danych w pliku
Public Const errOutOfRange       As Long = vbObjectError + err_plikError + 4


Public Function plikFileToArray( _
                      ByVal sFilePath As String, _
                      ByRef arrRetBytes() As Byte, _
              Optional ByVal lStart As Long = 1, _
              Optional ByVal lBytes As Long = -1) As Long
Dim lLenFile      As Long
Dim ff            As Integer
Const conProcName As String = "plikFileToArray(...)"
  
  ' Pomocnicza funkcja plikCheckArguments(...) znajduje się na stronie:
  ' http://www.accdb.pl/plik-odczyt-walidacja.html#plikCheckArguments
  ' -------------------------------------------------------------------
  ' sprawdź, czy możliwa jest operacja odczytu z pliku
  If plikCheckArguments(sFilePath, False, lStart, lBytes, , conProcName) = False Then
    plikFileToArray = -1
    Exit Function
  End If

  ' pobierz długość pliku w bajtach
  lLenFile = FileLen(sFilePath)
      
  ' jeżeli plik jest pusty to zakończ działanie
  If lLenFile = 0 Then
    plikFileToArray = 0
    Exit Function
  End If
  
  ' jeżeli numer początkowy bajtu odczytu jest większy
  ' od długości pliku, to wygeneruj błąd wykonania
  If lStart > lLenFile Then
    plikFileToArray = -1
    Err.Raise errOutOfRange, conProcName, _
              "Numer początkowy bajtu jest większy od długości pliku!"
  End If
  
  ' określ ilość bajtów do pobrania, począwszy od bajtu startowego
  If lBytes = -1 Then
    lBytes = lLenFile - lStart + 1
  Else
    ' jeżeli ilość bajtów do pobrania, począwszy od bajtu startowe przekracza rozmiar pliku
    ' dostosuj ilość pobieranych bajtów do rozmiaru pliku
    If (lStart + lBytes) > lLenFile Then lBytes = lLenFile - lStart + 1
  End If
  
  'pobierz pierwszy wolny numer pliku
  ff = FreeFile

  ' otwórz plik i pobierz dane
  Open sFilePath For Binary Access Read As #ff
    ' przygotuj tablicę na przyjęcie bajtów pliku
    ReDim arrRetBytes(0 To lBytes - 1)
    ' pobierz określoną ilość bajtów do przygotowanego buforu
    Get #ff, lStart, arrRetBytes
  Close #ff

  plikFileToArray = lBytes

End Function