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