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