Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Свитки
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  15:11[Войти] | [Зарегистрироваться]

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

Николай Чуносов
дата публикации 28-05-2008 09:29

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

Обычно, когда требуется преобразовать относительный путь в абсолютный, обычно советуют использовать 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, а также готовое простое тестовое приложение, чтобы можно было сразу, не отходя от кассы, попробовать, как все это работает.



К материалу прилагаются файлы:


Смотрите также материалы по темам:
[Файловая система] [Обработка текста]

 Обсуждение материала [ 06-06-2008 05:11 ] 1 сообщение
  
Время на сайте: GMT минус 5 часов

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

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования