(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Функции взаимного преобразования относительных и абсолютных путей с учетом заданной базы

Источник: delphikingdom
Николай Чуносов

Автор: Николай Чуносов, Королевство Delphi

Обычно, когда требуется преобразовать относительный путь в абсолютный, обычно советуют использовать API функцию GetFullPathName. Однако, согласно MSDN, она использует текущий диск и текущий каталог для создания полного пути, что не всегда бывает удобно. Говорят также, что в JEDI есть нечто подобное. Порывшись в той версии, что скачана у меня я нашел такую процедуру в модуле JclFileUtils:

function PathGetRelativePath(Origin, Destination: string): string;

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

Рискуя изобрести очередной велосипед, я все же решил написать собственные функции, которые не будут обращать внимания на текущий каталог (да и вообще на файловую систему). Предполагалось, что они будут использоваться при анализе некоторого файла-проекта, в котором входящие в него файлы хранятся с относительными путями. Соответственно, при добавлении нового файла в проект требуется создать путь к нему относительно пути к самому файлу проекта. И наоборот, при открытии проекта требуется "разрешить" все относительные пути исходя из пути к проекту.

Итак, на Ваше рассмотрение предлагаются:

function RelativePathToAbsolute(const ABasePath, APath: String): String;

Преобразует относительный путь APath в абсолютный, относительно базы ABasePath.

function AbsolutePathToRelative(const ABasePath, APath: String): String;

Преобразует абсолютный путь APath в относительный, используя как базу ABasePath.

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

Функции корректно обрабатывают не только буквы дисков, но также имена сетевых ресурсов, вроде \\comp1\folder1\. Если не указывать ни того ни другого, то предполагается, что передается юниксовый путь (\home\user1). Указывается или нет лидирующий слэш в таком случае не важно. Отличие этих записей в том, что если в путях указаны разные буквы дисков (в общем случае "любые символы дисков", т.к. проверки не проводится) или разные сетевые ресурсы, то относительный путь нельзя построить и AbsolutePathToRelative вернет тот же APath. В случае юниксового пути, относительный путь можно создать всегда.

В качестве начального разделителя пути используется глобальная переменная PathDelim. Модуль создает свою копию этой переменной, так что, если приложению требуется работать с несистемными разделителями пути, нужно просто присвоить новое значение переменной PathUtils.PathDelim. В принципе, Windows понимает и прямой и обратный слэш в качестве разделителя каталогов.

CaseSensetive - глобальная булева переменная, которая определяет чувствительность пути к регистру символов. Если приложению требуется обрабатывать юниксовые пути, то эту переменную следует выставить в True.

Еще одна вспомогательная функция, которая может быть полезна и как самостоятельная:

function GetRoot(const APath: String): String;

Возвращает "корень" пути. Это либо буква диска, если путь задан в виде "D:\folder1", либо имя сетевого ресурса, если путь указан как "\\server\folder1", либо корень файловой системы (\).

Модуль содержит также Wide-версии всех функций.

Прилагается архив с модулем PathUtils, а также готовое простое тестовое приложение, чтобы можно было сразу, не отходя от кассы, попробовать, как все это работает

Ссылки по теме

Файлы для загрузки


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 10.03.2009 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Enterprise Connectors (1 Year term)
Delphi Professional Named User
Nero 2018 Platinum ESD
IBM Domino Enterprise Server Processor Value Unit (PVU) Annual SW Subscription & Support Renewal
Dr.Web Security Space, продление лицензии на 1 год, 1 ПК
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Работа в Windows и новости компании Microsoft
Новые программы для Windows
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100