Перевод относительных путей в абсолютные

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Перевод относительных путей в абсолютные

Сообщение Александр Андреев » 26.05.2003 (Пн) 13:43

Есть относительный путь. К примеру "..\folder1". Нужно перевести его в абсолютный - "c:\<cur dir>\folder1". Как это сделать?

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 26.05.2003 (Пн) 13:54

смотря относительно чего у тебя "относительный путь"
если относительно текущего рабочего каталога, то функция CurDir тебя спасет

Функция CurDir
CurDir[ (Drive) ]

Функция CurDir(Drive) определяет текущую рабочую папку

Возвращаемое значение
Функция возвращает данные подтипа String типа Variant

Параметры
Drive
Необязательный аргумент.Строковое выражение,указывающее на текущую рабочую папку.Если аргумент Drive не указан или является пустой строкой(""),то функция CurDir возвращает путь к текущей рабочей папке текущего рабочего диска.
Drive задается только буквой с необязательным двоеточием после нее("C" или "C:").
Если Drive задан неправильно или не существует,генерируется ошибка стадии исполнения Device unavaible
Поскольку фунция воспринимает только однобуквенные названия дисков,использовать сетевые имена дисков нельзя
Пример:

Dim retval
retval=CurDir("C")
Form1.Caption= retval ' выводим строку в заголовке формы


если относительно рабочей папки программы, то наверное App.Path...

судя по твоему примеру "..\folder1" будет примерно так "c:\folder1", так как "..\" - это ссылка на корневую директорию диска.
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 26.05.2003 (Пн) 14:05

Cyrax писал(а):...так как ".." - это ссылка на корневую директорию диска.

Тщательнее, товаришь, тщательнее. Это не корневая дирректория, а на один уровень вверх по дереву дирректорий. Переход в корень это ""
Код: Выделить всё
Function GetAbsPath(ByVal RelPath As String) As String
    Dim CD_tmp As String
   
    CD_tmp = CurrDir()
    ChDir RelPath
    GetAbsPath = CurrDir()
    ChDir CD_tmp
End Function

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 26.05.2003 (Пн) 14:39

Спасибо!
2skiperski: отличная идея, только функция называется не CurrDir, а CurDir.

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 26.05.2003 (Пн) 15:30

Парни, еще одна issue возникла... Попробую описать...

Функция ChDir меняет текущий каталог но не меняет текущий драйв. Т.е. если я пишу следующий код:

Код: Выделить всё
Dim tmpDir As String

СhDrive("c")
ChDir("c:\")
ChDir("d:\folder1")
tmpDir = CurDir()


то в tmpDir у меня будет "c:\", а не "d:\folder1". Получить "d:\folder1" в tmpDir я смогу только предварительно вызвав СhDrive("d").

Таким образом, если я пытаюсь поменять текущий каталог на App.Path, мне нужно писать вот так:

Код: Выделить всё
СhDrive App.Path
ChDir App.Path


После этого я спокойно обрабатываю относительный путь:

Код: Выделить всё
ChDir myRelativePath


Это будет путь относительно текущего расположения моего приложения.
:twisted: НО: myRelativePath может по условию задачи содержать и абсолютный путь. И если в этом пути будет задан другой драйв, то исходя из вышесказанного я не смогу получить искомого пути вызовом CurDir, потому что на текущем драйве он не поменяется...
Что делать? :cry:

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 26.05.2003 (Пн) 15:53

Если результат пустая строка, то путя нема.
Код: Выделить всё
Public Function GetAbsPath(ByVal RelPath As String, ByVal CurPath As String) As String
   
    Dim tmp As String
   
    tmp = CurDir()
   
    On Error GoTo PathNotFound
    ChDrive CurPath
    ChDir CurPath
   
    On Error Resume Next
    ChDrive RelPath
   
    On Error GoTo PathNotFound
    ChDir RelPath
   
    GetAbsPath = CurDir()
    GoTo PathFound:
   
PathNotFound:
    Resume PathFound:
   
PathFound:
    On Error GoTo 0
    ChDrive tmp
    ChDir tmp
   
End Function

Immediate window
Код: Выделить всё
?GetAbsPath("..\b","c:\a")
c:\b

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 26.05.2003 (Пн) 18:49

:D Ну ты умелец... спасибо, вроде работает. Завтра оттестирую все как надо.

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 27.05.2003 (Вт) 15:42

Оттестировал. Работает.
Заодно вот что узнал: в FSO есть функция GetAbsolutePathName. Она то же самое делает. И вот как:

Код: Выделить всё
Private Function GetAbsPath(ByVal RelPath As String) As String

    Dim fso As New FileSystemObject
    Dim tmp As String

    tmp = CurDir()
       
    ChDrive App.Path
    ChDir App.Path

    GetAbsPath = fso.GetAbsolutePathName(RelPath)

    ChDrive tmp
    ChDir tmp

End Function


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 60

    TopList