Funkcja sprawdzająca argumenty otwarcia pliku.
Przed pobraniem zawartości pliku do zmiennej typu String bądź tablicy bajtów, lub zapisem danych do pliku powinniśmy wcześniej sprawdzić, czy operacja odczytu/zapisu jest możliwa. Wystąpić może kilka różnych przyczyn, które uniemożliwią nam odczytanie danych z pliku lub zapisanie danych do pliku.
Otwarcie pliku.
Plik możemy otworzyć za pomocą instrukcji Open opisanej na stronie
Plik. Instrukcja Open.
W przypadku operacji odczytu danych z pliku, warunkiem koniecznym jest by plik istniał. Możemy to sprawdzić w bardzo łatwy sposób
za pomocą wbudowanej funkcji Dir:
If Len(Dir(sFilePath)) > 0 Then => plik istnieje
- W przypadku gdy plik sFilePath nie istnieje, a my chcemy wykonać operację
- odczytu danych z nieistniejącego pliku, to za pomocą metody Raise obiektu Err powinniśmy wygenerować wtedy błąd wykonania o numerze 53 (File Not found), który będziemy musieli potem obsłużyć.
- zapisu danych do pliku sFilePath, a plik nie istnieje, to plik zostanie utworzony jeśli tryb otwarcia pliku będzie typu Append, Binary, Output lub Random.
Aby sprawdzić, czy możemy odczytywać dane z pliku sFilePath spróbujmy go otworzyć w trybie dostępu binarnym (Binary) i do odczytu (Read).
Open sFilePath For Binary Access Read As #ff
' nie rób nic
Close #ff
Aby sprawdzić, czy możemy zapisywać dane do pliku sFilePath spróbujemy go otworzyć w trybie dostępu binarnymBinary do zapisu (Write).
Open sFilePath For Binary Access Write As #ff
' nie rób nic
Close #ff
- Jeżeli otwierany w trybie do „Zapisu” plik ma ustawiony atrybut vbReadOnly generowany jest błąd wykonania o numerze 75 (Path/File access error). W takim przypadku nie będziemy mogli zapisać danych do takiego pliku.
- Jeżeli otwierany do „Odczytu” lub „Zapisu” plik został wcześniej otwarty przez inny proces „Na wyłączność”, generowany jest błąd wykonania numerze 70 (Permission denied). W takim przypadku nie będziemy mogli odczytać, ani zapisać danych do takiego pliku.
- Gdy otwierany plik został wcześniej otwarty przez inny proces, a podany tryb dostępu jest niedozwolony generowany jest błąd nr 55 (File already open). Dotyczy to trybu otwarcia pliku Append i Output, dla których plik otwarty z innym numerem należy zamknąć.
Dodatkowe argumenty funkcji sprawdzającej
Aby uzyskać potrzebne dane z pliku, nie musimy odczytywać bezpośrednio całej zawartości pliku i ją przetwarzać w celu uzyskania potrzebnych danych. Dane z pliku możemy pobrać jednorazowo określając:
- numer początkowego bajtu, znaku lub linii, od którego ma być dokonana operacja odczytu,
- ilość bajtów, znaków, linii które mają być pobrane,
- oraz w niektórych przypadkach powinniśmy określić znak końca linii. Dopuszczalny jest znak Chr$(13) lub vbNewLine (Chr$(13) & Chr$(10).
Pomocnicza funkcja sprawdzająca poprawność argumentów funkcji odczytujących i zapisujących dane do pliku.
⊗Public Function plikCheckArguments( _
ByVal sFilePath As String, _
ByVal fToWrite As Boolean, _
Optional ByVal lStart As Long = 1, _
Optional ByVal lCount As Long = -1, _
Optional ByVal sCharsEnd As String = vbNewLine) As Boolean
- Pomocnicza funkcja plikCheckArguments (...) sprawdzająca poprawność argumentów funkcji odczytujących i zapisujących dane do pliku.
- argumenty:
- sFilePath
-
pełna ścieżka do pliku, na którym będzie wykonywana operacja zapis lub odczytu
- dla operacji „Odczytu” za pomocą funkcji plikFileExist(...) sprawdzane jest, czy plik sFilePath istnieje. Jeżeli plik nie istnieje generowany jest błąd wykonania o numerze errFileNotExist.
- dla operacji „Zapisu” plik sFilePath nie może mieć atrybutu vbReadOnly. Generowany jest wtedy błąd wykonania o numerze 75 (Path/File access error).
- gdy plik sFilePath jest otwarty przez inny proces „Na wyłączność”, generowany jest błąd wykonania o numerze 70 (Permission denied)
- gdy plik sFilePath został wcześniej otwarty przez inny proces, a podany tryb dostępu jest niedozwolony generowany jest błąd nr 55 (File already open). Dotyczy to trybu otwarcia pliku Append i Output, dla których plik otwarty z innym numerem należy zamknąć.
- fToWrite
- argument określa tryb w jakim ma być otwarty plik sFilePath. Dla wartości True plik ma być otwarty w trybie „Do zapisu”. Dla wartości False plik ma być otwarty w trybie „Do odczytu”.
- lStart
- Domyślna wartość = 1. Numer początkowego bajtu (znaku, linii) od którego ma być dokonana operacja odczytu lub zapisu, Dla wartości argumentu lStart < 1 generowany jest błąd wykonania o numerze errArgFailValue. Jeżeli numer początkowego bajtu lStart przekracza rozmiar pliku, generowany jest błąd wykonania o numerze errFileOutOfRange. Dla wartości argumentu fToWrite = True (plik ma być otwarty w trybie „Do zapisu”) argument lStart jest ignorowany.
- lCount
- Domyślna wartość = - 1. Ilość bajtów (znaków, linii) do operacji odczytu lub zapisu. Dla domyślnej wartości = -1 odczytane zostaną wszystkie bajty, (znaki, linie) od pozycji lStart. Wartość argumentu nie może być mniejsza od -1, ani równa Zero. Generowany jest wtedy błąd wykonania o numerze errArgFailValue.
- sCharsEnd
-
argument nieobowiązkowy. Domyślna wartość = vbNewLine.
Znak określający koniec linii. Dopuszczalny jest znak Chr$(13) lub vbNewLine (Chr$(13) & Chr$(10).
Ewentualnie (przy zapisie) ciąg zerowej długości "".
Dla innych wartości argumentu sCharsEnd generowany jest błąd wykonania o numerze errArgFailEndLine. - sProcName
- argument nieobowiązkowy. Domyślna wartość = "". Nazwa funkcji wywołującej, która w przypadku wywołania błędu przekazywana jest jako argument Source := sProcName metody Err.Raise. Jeżeli nazwa funkcji wywołującej nie zostanie przekazana, wartość argumentu sProcName ustawiana jest na nazwę bieżącej funkcji sProcName = cProcName, gdzie stała cProcName = "Funkcja plikCheckArguments(...)"
- zwraca:
-
Przy powodzeniu zwraca TRUE, w przeciwnym wypadku FALSE.
- autor: Zbigniew Bratko
- data: 11.01.2018
Option Compare Database
Option Explicit
Public Function plikCheckArguments( _
ByVal sFilePath As String, _
ByVal fToWrite As Boolean, _
Optional ByVal lStart As Long = 1, _
Optional ByVal lCount As Long = -1, _
Optional ByVal sCharsEnd As String = vbNewLine) As Boolean '
Dim ff As Integer
Dim lErrNo As Long
Dim sErrDscr As String
Const cProcName As String = "Funkcja plikCheckArguments(...)"
' jeżeli odczytujemy dane z pliku, to plik musi istnieć
If fToWrite = False Then
If plikFileExist(sFilePath) = False Then
Err.Raise errFileNotExist, cProcName, _
errBmpDescription(errFileNotExist)
End If
End If
' sprawdź numer początkowy bajtu (znaku, linii) do odczytu
If lStart < 1 Then
Err.Raise errArgFailValue, cProcName, _
errBmpDescription(errArgFailValue)
End If
' sprawdź poprawność ilości bajtów (znaków, linii) do odczytu
If lCount = 0 Or lCount < -1 Then
Err.Raise errArgFailValue, cProcName, _
errBmpDescription(errArgFailValue)
End If
' sprawdź poprawność znaku końca linii
If Len(sCharsEnd) > 0 Then
If Not (sCharsEnd = Chr$(13) Or sCharsEnd = vbNewLine) Then
Err.Raise errArgFailEndLine, cProcName, _
errBmpDescription(errArgFailEndLine)
End If
Else
' przy odczycie, końcem linii nie może być ciąg zerowej długości
If fToWrite = False Then
Err.Raise errArgFailEndLine, cProcName, _
errBmpDescription(errArgFailEndLine)
End If
End If
' plik istnieje - spróbuj go otworzyć do odczytu lub zapisu
' i pułapkuj ewentualne błędy
If Len(Dir(sFilePath)) > 0 Then
ff = FreeFile
' wyłącz obsługę błędów
On Error Resume Next
If fToWrite = True Then
Open sFilePath For Binary Access Write As #ff
Else
Open sFilePath For Binary Access Read As #ff
End If
'pułapkuj błędy
If Err.Number < > 0 Then
'zapamiętaj numer i opis błędu
lErrNo = Err.Number
sErrDscr = Err.Description
Err.Clear
On Error GoTo 0
Select Case lErrNo
Case errFileAlreadyOpen
Err.Raise errFileAlreadyOpen, cProcName, _
errBmpDescription(errFileAlreadyOpen)
Case errPermissionDenied
Err.Raise errPermissionDenied, cProcName, _
errBmpDescription(errPermissionDenied)
Case errReadOnly
Err.Raise errReadOnly, cProcName, _
errBmpDescription(errReadOnly)
Case Else
Err.Raise lErrNo, cProcName, sErrDscr
End Select
End If
On Error GoTo 0
Close #ff
End If
plikCheckArguments = True
End Function