Использование VBA как определить, указывает ли путь на локальный жесткий диск или где-то в сети?

#vba

#vba

Вопрос:

У меня возникают проблемы с производительностью, когда пользователи выбирают сетевой диск в качестве места для сохранения файла, создаваемого моим макрокомандой.

Чтобы повысить эффективность, я подумываю о том, чтобы определить, является ли местоположение локальным или сетевым, и если оно находится в сети, я получу свой макрос, чтобы сохранить сгенерированный файл во временную папку и просто переместить его после его создания.

Используя VBA, как бы вы определили, является ли путь M:Folder Name локальной папкой (быстро управляемой) или находится в сети (требуется много времени для обработки запросов через VPN)?

Ответ №1:

Вы можете использовать функцию API GetDriveTypeA — см. https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea

Поместите следующий код в модуль. Вы можете использовать функцию getDriveType для получения строки, описывающей тип диска, или использовать функцию isNetworkDrive , чтобы просто проверить, указывает ли буква диска на сетевой диск.

Вы можете передать полное имя папки или файла в качестве параметра, процедуры принимают только первый символ и добавляют : . Например, просто назовите это так:

 If isNetworkDrive("M:Folder Name") Then
    MsgBox "This is a network drive"
End If
  

Если вы хотите сделать его более сложным, сначала проверьте, является ли параметр UNC-путем (начиная с \ )

 Option Explicit

#If VBA7 Then
Declare PtrSafe Function apiGetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
#Else
Declare Function getDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
#End If

Function isNetworkDrive(path As String) As Boolean
    Dim driveType As Integer
    driveType = apiGetDriveType(getDrivePath(path))
    isNetworkDrive = (driveType = 4)
End Function

Function getDriveType(path As String) As String
    ' See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea
    Dim driveType As Integer
    driveType = apiGetDriveType(getDrivePath(path))
    
    If driveType = 0 Then
        getDriveType = ""               ' Drive unknown.
    ElseIf driveType = 1 Then
        getDriveType = "(undefined)"               ' No Root (not mounted?)
    ElseIf driveType = 2 Then
        getDriveType = "Removable"
    ElseIf driveType = 3 Then
        getDriveType = "Fixed"
    ElseIf driveType = 4 Then
        getDriveType = "Network"
    ElseIf driveType = 5 Then
        getDriveType = "CD-Rom"
    ElseIf driveType = 6 Then
        getDriveType = "Ram Disk"
    Else
        getDriveType = ""               ' Can never happen according to documentation
    End If
End Function

Function getDrivePath(ByVal path As String)
    GetDrivePath = UCase(Left(path, 1)) amp; ":"
End Function
  

Ответ №2:

Базовая функция https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea GetDriveType .

Определяет, является ли дисковод съемным, фиксированным, CD-ROM, RAM-диском или сетевым диском.