Access

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



• Jak pobrać plik lub jego fragment do zmiennej typu String.

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”.

Odczyt danych z pliku do zmiennej typu String.

Skoro mamy funkcję sprawdzającą poprawność argumentów, to napiszmy pierwszą funkcje, które z niej korzysta. Będzie nią funkcja plikFileToString(...) która pobiera do zmiennej typu String plik, lub fragment pliku.

⊗ Public Function plikFileToString( _
                 ByVal sFilePath As String, _
                 ByRef sRetString As String, _
        Optional ByVal lStart As Long = 1, _
        Optional ByVal lBytes As Long = -1) As Long
  • Funkcja plikFileToString (...) otwiera plik w trybie „Do odczytu” i pobiera kreśloną ilość bajtów lBytes, począwszy od startowego bajtu lStart. Zwraca ilość pobranych bajtów, a w argumencie ByRef sRetString As String zwraca pobrane bajty.
  • argumenty:
    • sFilePath
    • pełna ścieżka do pliku, plik musi istnieć i nie może być otwarty na wyłączność.
    • sRetString
    • przekazywany ByRef argument, w którym zwracane są pobrane bajty. Przy niepowodzeniu wywołania funkcji zawiera ciąg zerowej długości "".
    • 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 w argumencie ByRef sRetString ciąg zerowej długości "".
    • 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 sRetString zwraca pobrane bajty. Przy niepowodzeniu zwraca -1, a w argumencie ByRef sRetString ciąg zerowej długości "".
    Jeżeli plik nie zawiera danych (jest pusty) funkcja zwraca 0, a w argumencie ByRef sRetString ciąg zerowej długości "".
  • autor: Zbigniew Bratko
  • data: 15.01.2018

  • Uwaga.
    Funkcja plikFileToString(...) 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 plikFileToString( _
                 ByVal sFilePath As String, _
                 ByRef sRetString As String, _
        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 = "plikFileToString(...)"
      
  sRetString = ""
  
  ' 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
    plikFileToString = -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
    plikFileToString = 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
    plikFileToString = -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 bufor na przyjęcie bajtów pliku
      sRetString = String(lBytes, vbNullChar)
      ' pobierz określoną ilość bajtów przygotowanego buforu
      Get #ff, lStart, sRetString
  Close #ff
  
  ' zwróć ilość pobranych bajtów
  plikFileToString = lBytes

End Function