Access

  MS Access 2010+  |  Przetwarzanie plików  |   VBA 7.0

• Czy plik istnieje na dysku?

Przy każdej próbie odwołania się do pliku na dysku, powinniśmy upewnić się, czy plik faktycznie znajduje się w miejscu docelowym na dysku.

Niedozwolone znaki w nazwie katalogu lub pliku.

Przed sprawdzeniem za pomocą funkcji DIR, czy plik znajduje się na dysku, należy sprawdzić, czy pełna ścieżka do pliku nie zawiera zastrzeżonych znaków, które nie mogą występować w nazwach katalogów i plików. System Windows sam podpowiada jakich znaków nie możemy używać w nazwach:

Niepoprawne znaki

Znak ':' może wystąpić w pełnej ścieżce, ale tuż za nazwą (literowym oznaczeniem) dysku, a znak '\' służy jako separator katalogów. Żaden z tych dwóch znaków nie może występować w nazwie katalogu lub pliku.

• Funkcja sprawdzająca, czy plik istnieje na dysku.

⊗ Public Function plikFileExist(sFullPath As String) As Boolean
  • Funkcja plikFileExist (...) sprawdza, czy w lokalizacji na którą wskazuje argument sFullPath, będący pełna ścieżką do pliku, znajduje się wskazany plik. Funkcja pobiera położenie pierwszego wystąpienie znaku ':' oraz położenie ostatniego wystąpienia znaku '\' w  pełnej ścieżce do pliku sFullPath. Jeżeli znaki te ':' i '\' nie występują, lub gdy znak '\' znajduje się na końcu ścieżki funkcja kończy działanie.
    Jeżeli wszystko jest w porządku, funkcja sprawdza, począwszy od znaku po pierwszym wystąpieniu znaku ':', czy którykolwiek ze znaków cBadChars = ":/*?<"">|" występuje w pełnej ścieżce do pliku. Jeżeli którykolwiek nieprawidłowy znak zostaje znaleziony, funkcja generuje błąd wykonania informując, że w ścieżce do pliku został znaleziony nieprawidłowy znak. Następnie z pełnej ścieżki do pliku pobrana zostaje nazwa pliku wraz z rozszerzeniem która zostaje porównana z nazwą pliku jaka została zwrócona przez funkcję Dir.
  • argumenty:
    • sFullPath
    • pełna ścieżka do pliku
  • zwraca:
  • Przy powodzeniu, jeżeli plik znajduje się na dysku, zwraca TRUE. Przy niepowodzeniu, gdy plik nie został znaleziony, lub pełna ścieżka do pliku zawiera nieprawidłowy znak, funkcja zwraca FALSE.
  • autor: Zbigniew Bratko
  • data: 04.02.2019
Option Compare Database
Option Explicit
'dolna granica zakresu numerów błędów dotyczących plików
Private Const errFileError          As Long = vbObjectError + 100
'nazwa pliku zawiera nieprawidłowe znaki
Private Const errFileBadName         As Long = errFileError + 1

Public Function plikFileExist(sFullPath As String) As Boolean
Dim lInStr        As Long
Dim lInStrRev     As Long

Dim sFileName     As String
Dim sBadChars()   As Byte
Dim i             As Integer
Const cBadChars   As String = ":/*?<"">|"
Const cProcName   As String = "Funkcja fileNameFileFromPath(...)"
Const cAttribFile As Long = vbNormal Or vbReadOnly Or vbHidden Or vbArchive

	' pobierz położenie pierwszego wystąpienia znaku ":"
	lInStr = InStr(1, sFullPath, ":", vbBinaryCompare)
	' pobierz położenie ostatniego wystąpienia znaku "\"
	lInStrRev = InStrRev(sFullPath, "\", -1, vbBinaryCompare)

	' jeżeli nie ma znaku ";" lub "\", lub znak "\" jest na końcu ścieżki to wyjdź
	If lInStr = 0 Or lInStrRev = 0 Or lInStrRev = Len(sFullPath) Then Exit Function

	'przygotuj tablicę z kodami ASCII nieprawidłowych znaków
	sBadChars() = StrConv(cBadChars, vbFromUnicode)

	lInStr = lInStr + 1
	' sprawdzaj w pętli, od znaku po pierwszym wystąpieniu ':',
	' czy ścieżka pliku zawiera nieprawidłowy znak
	For i = LBound(sBadChars) To UBound(sBadChars)
		If InStr(lInStr, sFullPath, Chr$(sBadChars(i)), vbBinaryCompare) Then
			Err.Raise errFileBadName, cProcName, _
								"Pełna nazwa pliku zawiera nieprawidłowy znak [ " & Chr$(sBadChars(i)) & " ]."
			End If
	Next

	'wyodrębnij nazwę pliku z rozszerzeniem ze ścieżki
	sFileName = Mid$(sFullPath, lInStrRev + 1)

	' porównaj, czy funkcja Dir zwróciła taką samą nazwę pliku sFileName
	If StrComp(Dir(sFullPath, cAttribFile), sFileName, vbTextCompare) = 0 Then
		plikFileExist = True
	End If

End Function