Относительные пути - VB
Формулировка задачи:
Недавно столкнулся с такой записью пути файла:
..\..\..\..\..\..\WINDOWS\system32\SHELL32.dll
Полный путь можно получить так:Какая инструкция создаёт такие имена ?
Что интересно, если изменять эти значения то абсолютное имя может поменятьсяРешение задачи: «Относительные пути»
textual
Листинг программы
Option Explicit
Public Function RelativeName$(AbsName$, Optional RelativeFolder$)
'Создание относительного пути
'Арг: Полный путь // Относительная папка [Текущая по умолчанию]
Const r$ = "\", rp$ = "..\"
Dim MyDir$, ja$(), jr$(), ua&, ur&, f&, Min&, AdUp&, Ign&
MyDir = IIf(RelativeFolder <> vbNullString, RelativeFolder, CurDir$)
ja = Split(AbsName, r): jr = Split(MyDir, r)
ua = UBound(ja): ur = UBound(jr)
Min = IIf(ua < ur, ua, ur) 'верхний индекс для обоих путей
For f = 0 To Min
If StrComp(ja(f), jr(f), vbTextCompare) = 0 Then 'Сравнение +игнор. регистра
ja(f) = vbNullString: Ign = Ign + 1
ElseIf f = 0 Then 'Если разные драйверы (буква диска)
RelativeName = AbsName 'Возврат полного пути
Exit Function
Else: AdUp = AdUp + 1 'Добавить если папка ещё глубже
End If
Next
RelativeName = Mid$(Join(ja, r), Ign + 1) 'Отрезать путь соответствия
For f = ur + AdUp To f Step -1 'Добавить трактовку
RelativeName = rp & RelativeName
Next
End Function
Private Sub Form_Load()
'
' Тестирование моей функции RelativeName
'
Dim absN$, relF$, result$, o As Object
Set o = CreateObject("Scripting.FileSystemObject")
'=================================
1
absN = "C:\WINDOWS\system32"
relF = "C:\Program Files\Microsoft Visual Studio\VB98"
result = RelativeName(absN, relF)
ChDir (relF) 'Установить текущую
Debug.Print "Пример 1 ======================================"
Debug.Print "Абсолютный путь: ", absN & vbCrLf
Debug.Print "Относительная папка: ", relF & vbCrLf
Debug.Print "Выходной путь: ", result & vbCrLf
Debug.Print "Как это видит система:", o.GetAbsolutePathName(result) & vbCrLf
Debug.Print
2
absN = "C:\Program Files\Microsoft Visual Studio\VB98"
relF = "C:\WINDOWS\system32"
result = RelativeName(absN, relF)
ChDir (relF)
Debug.Print "Пример 2 ======================================"
Debug.Print "Абсолютный путь: ", absN & vbCrLf
Debug.Print "Относительная папка: ", relF & vbCrLf
Debug.Print "Выходной путь: ", result & vbCrLf
Debug.Print "Как это видит система:", o.GetAbsolutePathName(result) & vbCrLf
Debug.Print
3
absN = "C:\WINDOWS\system32\SHELL32.dll"
relF = "C:\Program Files\Microsoft Visual Studio\VB98"
result = RelativeName(absN, relF)
ChDir (relF)
Debug.Print "Пример 3 ======================================"
Debug.Print "Абсолютный путь: ", absN & vbCrLf
Debug.Print "Относительная папка: ", relF & vbCrLf
Debug.Print "Выходной путь: ", result & vbCrLf
Debug.Print "Как это видит система:", o.GetAbsolutePathName(result) & vbCrLf
Debug.Print
Stop 'Остановка /// просмотр окна Immediate
End Sub