Читаем Delphi. Трюки и эффекты полностью

Листинг 4.20.

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

function AbsPathToRelative(path, curdir: String): String;

var

pathElements, curElements: TStrings;

outPath: String;

i, j: Integer;

begin

if Copy(path, 1, 2) <> Copy(curdir, 1, 2) then

begin

//Папки на разных дисках

AbsPathToRelative := path;

Exit;

end;

//Получение составляющих абсолютного и текущего пути

pathElements := TStringList.Create;

GetPathElements(path, pathElements);

curElements := TStringList.Create;

GetPathElements(curdir, curElements);

//Пропускаем одинаковые папки

i := 0;

while (i < curElements.Count) and (i < pathElements.Count)

and (CompareText(curElements[i], pathElements[i]) = 0) do Inc(i);

//Добавляем небходимое количество переходов вверх для того,

//чтобы из папки curdir попасть в общую для path и curdir папку

for j := i to curElements.Count-1 do

outPath := outPath + \'..\\

//Заходим из папки полученной (общей) папки в папку path

for j := i to pathElements.Count – 2 do

outPath := outPath + pathElements[j] + \'\\

//Последним добавляем имя конечной папки или файла

AbsPathToRelative := outPath + pathElements[pathElements.Count – 1];

//Списки строк больше не нужны

pathElements.Free;

curElements.Free;

end;

При преобразовании нужно учитывать, что пути, не принадлежащие одной иерархии (например, локальный и сетевой или пути, принадлежащие разным дискам, не могут быть представлены один относительно другого: у них нет общего родительского каталога.

Обратное преобразование относительного пути в абсолютный приведено в листинге 4.21. Здесь нужно отметить, что если путь папки curdir относительный, то в итоге получим также относительный путь (только относительно другой папки). Поэтому функция и называется RelativePathToRelative, а не RelativePathToAbs.

...

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ

Эта книга представляет собой перевод третьего издания американского бестселлера Effective C++ и является руководством по грамотному использованию языка C++. Она поможет сделать ваши программы более понятными, простыми в сопровождении и эффективными. Помимо материала, описывающего общую стратегию проектирования, книга включает в себя главы по программированию с применением шаблонов и по управлению ресурсами, а также множество советов, которые позволят усовершенствовать ваши программы и сделать работу более интересной и творческой. Книга также включает новый материал по принципам обработки исключений, паттернам проектирования и библиотечным средствам.Издание ориентировано на программистов, знакомых с основами C++ и имеющих навыки его практического применения.

Скотт Мейерс , Скотт Майерс

Программирование, программы, базы данных / Программирование / Книги по IT