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