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