(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
Delphi Professional Named User
Enterprise Connectors (1 Year term)
Microsoft Office 365 Профессиональный Плюс. Подписка на 1 рабочее место на 1 год
Business Studio 4.2 Professional. Персональная лицензия. Лицензия на 1 месяц.
Microsoft Windows Professional 10, Электронный ключ
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
Реестр Windows. Секреты работы на компьютере
СУБД Oracle "с нуля"
Delphi - проблемы и решения
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100