20. Jak sprawdzić, czy program uruchomiono z dysku sieciowego?

Każdy zdrowy człowiek jest leniwy! Programiści i użytkownicy ich programów również. Kiedy udostępniłem w sieci program, który każdy miał obowiązek przekopiować sobie na dysk lokalny - rzadko kto to wykonał i wiele osób odpalało program z lokalizacji sieciowej. Pomijam problem, że w tym układzie nie mogłem uaktualnić wersji, bo plik był w użyciu, to ciągnięcie programu z serwera jest rozwiązaniem bardzo nieefektywnym, zawodnym i wręcz nie do użytku w przypadku, gdy np. wykorzystujemy jakieś tymczasowe obiekty.

Poniższy kod wykrywa, czy program został wywołany z dysku sieciowego. Należy to sprawdzić przy starcie naszej aplikacji. W przypadku wykrycia lokalizacji sieciowej należy wyświetlić odpowiedni komunikat z prośbą o przekopiowanie pliku na komputer lokalny i zamknąć program.

A oto procedura, która wykrywa lokalizację sieciową bieżącej bazy:

Declare Function GetDriveType Lib "kernel32" Alias _
        "GetDriveTypeA" (ByVal sDrive As String) As Long


Public Function DriveType(sDrive As String) As String
Dim sDriveName As String
On Error Resume Next
    Const DRIVE_TYPE_UNDTERMINED = 0
    Const DRIVE_ROOT_NOT_EXIST = 1
    Const DRIVE_REMOVABLE = 2
    Const DRIVE_FIXED = 3
    Const DRIVE_REMOTE = 4
    Const DRIVE_CDROM = 5
    Const DRIVE_RAMDISK = 6
   
    If sDrive = "\" Then
        DriveType = "is a remote I.E Network drive."
    Else
        sDriveName = GetDriveType(sDrive & ":\")
        Select Case sDriveName
          Case DRIVE_TYPE_UNDTERMINED
            DriveType = "has not been recognized"
          Case DRIVE_ROOT_NOT_EXIST
            DriveType = "specified doesn't exist"
          Case DRIVE_CDROM
            DriveType = "is a CD-ROM drive."
          Case DRIVE_FIXED
            DriveType = "cannot be removed I.E. Hard Disk"
          Case DRIVE_RAMDISK
            DriveType = "is a RAM disk."
          Case DRIVE_REMOTE
            DriveType = "is a remote I.E Network drive."
          Case DRIVE_REMOVABLE
            DriveType = "can be removed I.E. Floppy Disk."
        End Select
    End If
End Function

Public Function CzyNET() As Boolean
On Error Resume Next
    CzyNET = False
    If DriveType(Left(CurrentDb.Name, 1)) Like "*Network drive*" Then
        CzyNET = True
    End If
End Function
W celu sprawdzenia, czy uruchomiono program z sieci, można posłużyć się następującym kodem:
If CzyNET = True Then
    MsgBox "Program wywołano z lokalizacji sieciowej. Przekopiuj plik na dysk lokalny.",48
    DoCmd.Quit acQuitSaveNone
Else
    'OK
End If
To jest dość rozbudowane rozpisanie funkcji GetDriveType, które miało na celu przedstawić pozostałe typy dysków zwracane przez tę funkcję. W rzeczywistych zastosowaniach można całe sprawdzenie uprościć do kilku linijek, zachęcam do prób.

K. P.