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
 

 

 
Akceptuję Polityka prywatności Tekst informacyjny o polityce Cookies