Функції взаємної перетворення відносних і абсолютних шляхів з урахуванням заданої бази, Різне, Програмування, статті

Автор: Микола Чуносов, Королівство 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.


Функції ніяк не прив’язані до файлової системи і, формально, є просто фунції обробки рядків відповідного виду. Перевірка правильності шляху та наявності неприпустимих символів не проводиться. Хоча це не складно додати, якщо знадобиться.


Функції коректно обробляють не тільки літери дисків, але також імена мережевих ресурсів, начебто comp1folder1. Якщо не вказувати ні того ні іншого, то передбачається, що передається юніксової шлях (homeuser1). Вказується чи ні лідируючий слеш в такому випадку не важливо. Відмінність цих записів у тому, що якщо в шляхах вказані різні літери дисків (в загальному випадку “будь-які символи дисків”, тому що перевірки не проводиться) або різні мережеві ресурси, то відносний шлях не можна побудувати і AbsolutePathToRelative поверне той же APath. У разі юніксової шляху, відносний шлях можна створити завжди.


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


CaseSensetive – глобальна булева змінна, яка визначає чутливість шляху до регістру символів. Якщо додатку потрібно обробляти юніксової шляху, то цю змінну слід виставити в True.


Ще одна допоміжна функція, яка може бути корисна і як самостійна:

function GetRoot(const APath: String): String;

Повертає “корінь” шляху. Це або буква диска, якщо шлях заданий у вигляді “D: folder1”, або ім’я мережного ресурсу, якщо шлях вказаний як “serverfolder1”, або корінь файлової системи ().


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


Додається архів з модулем PathUtils, а також готове просте тестове додаток, щоб можна було відразу, не відходячи від каси, спробувати, як все це працює

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*