Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Абсолютный или относительный путь? 
:(
    Опции темы
Borland_Delphi_6
  Дата 16.1.2005, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



Есть переменная s:string, в нее забит путь, что-то типа "file.bmp" или "c:\file.bmp". Как узнать, записан ли в переменную абсолютный, или относительный путь? smile


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
NiJazz
Дата 16.1.2005, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Если абсолютный путь - это file.bmp, то вот следующая функция:
Код

function IsAbsolute(path: string): boolean;
begin
 if path = ExtractFileName(path) then result := true
 else result := false;
end;

В противном случае поменяй true на false и наоборот в теле функции.
PM MAIL   Вверх
Borland_Delphi_6
Дата 16.1.2005, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



NiJazz
Нет, абсолютный - это полный адрес, а только имя файла - относительный. Но в любом случае, как попробую - дам знать smile
Добавлено @ 18:59
NiJazz
Кстати, по-моему я так уже пробовал. И если мне не изменяет память - прога не скомпилилась smile


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
Borland_Delphi_6
Дата 16.1.2005, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



[FROM_OFFLINE]
Однако же это натолкнуло меня на мысль, которая написала мне функцию smile
Код


function IsAbsolute(FName:String):String;
var
Final:String;
begin
Final:=ExtractFileName(Fname);
if Final = FName then Result:=ExtractFilePath(Application.ExeName)+Final //относительный
else if Final <> FName then Result:=Fname; //асболютный
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
IsAbsolute('file.bmp')
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
IsAbsolute('C:\file.bmp')
end;


Не слишком красиво, но работает. smile Если у кого есть лучший вариант - жду с нетерпением smile
[/FROM_OFFLINE]

Это сообщение отредактировал(а) p0s0l - 30.9.2005, 17:34


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
p0s0l
Дата 16.1.2005, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Можно еще так попробовать:
Код
function IsAbsolute(path: string): boolean;
begin
 Result := Pos(':', path) <> 0;
end;
т.к. ":" всегда присутствует в абсолютных путях, а в имени файла он не может встречаться (если мне не изменяет память...)


--------------------
С уважением, г-н Посол.
PM   Вверх
Borland_Delphi_6
Дата 16.1.2005, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



p0s0l
Кстати это идея... Но т.к. я уже свою функцию всунул везде. где мне надо было, менять не стану smile


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
NiJazz
Дата 16.1.2005, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Borland_Delphi_6
Цитата
Кстати, по-моему я так уже пробовал. И если мне не изменяет память - прога не скомпилилась smile

Я пробовал прогнать, всё работало нормально.
Добавлено @ 21:53
Ну если тебе точно надо подстраховаться, сделай так: smile
Код

procedure TForm1.Button1Click(Sender: TObject);
////////////////////////////////////////////////
 function IsAbsolute(path: string): boolean;
 begin
   if path = ExtractFileName(path) then result := false
   else result := true;
 end;
////////////////////////////////////////////////
var path: string;
begin
 path := 'C:\MyDir\Myfile.txt';
 if (Pos(path, ':') < 1)
     and (Pos(path, '\') < 1)
     and IsAbsolute(path) then
       ShowMessage(ExtractFileName(path));
end;

PM MAIL   Вверх
Borland_Delphi_6
Дата 16.1.2005, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



smile Но я же сказал, что уже все сделал smile


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
Петрович
Дата 17.1.2005, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата(p0s0l @ 16.1.2005, 21:24)
т.к. ":" всегда присутствует в абсолютных путях, ...

Это не так. Вот примеры абсолютных путей в которых не присутствует ':' :
\Вася\Петя\Маша.txt - абсолютный путь от текущего устройства
\\KidsComputer\DriveC\Program Files\Borland\Delphi6\readme.txt - абсолютный путь для сетевого устройства



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
p0s0l
Дата 17.1.2005, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Петрович, это правильно подмечено smile



--------------------
С уважением, г-н Посол.
PM   Вверх
Snowy
Дата 18.1.2005, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



А как относиться к путям типа:
..\..\MyDir\my.bmp
.\my.bmp
или такое извращение:
\\server\common\files\..\doc\.\my.bmp

Это как считать? Абсолютные или относительные?

Я думаю, что абсолютные - которые включают диск: или \\
PM MAIL   Вверх
SlaUr
Дата 18.1.2005, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Может все таки Pos(st1,'\')>0 ?
PM MAIL   Вверх
Петрович
Дата 18.1.2005, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата(Snowy @ 18.1.2005, 10:55)
А как относиться к путям типа:
..\..\MyDir\my.bmp
.\my.bmp
или такое извращение:
\\server\common\files\..\doc\.\my.bmp

А в чем вопрос?
..\..\MyDir\my.bmp и .\my.bmp это однозначно относительные пути.
а
\\server\common\files\..\doc\.\my.bmp - однозначно абсолютный.
А чтобы не было сомнений smile абсолютным путем следует считать любой путь, который однозначно определяет каталог (папку) вне зависимости от того, какой каталог является текущим в данный момент (.\). Например для ..\..\MyDir\my.bmp, здесь речь идет о каталоге MyDir "растущего" из каталога который находится на два уровня выше текущего каталога.
Ну а с .\my.bmp еще проще. Речь идет о файле my.bmp находящимся в текущем каталоге.
С \\server\common\files\..\doc\.\my.bmp тоже все просто: это полностью эквивалентно \\server\common\doc\my.bmp. Т.е. этот путь ну ни как не зависит от того какой каталог текущий.

Вооще то, такие вещи надо знать.

Цитата(SlaUr @ 18.1.2005, 11:17)
Может все таки Pos(st1,'\')>0 ?

Нет. Есть такой вариант: a:\x\y.bmp - тут твой вариант ошибется.

Более того, бывают и такие варианты: a:y.bmp. Это относительный путь! Он зависит от того, какой каталог текущий на девайсе a:.
Напомню, тем кому не довелось работать под DOS: Для каждого имеющегося системе логического диска хранится значение текущего каталога. Более того, эти значения индивидуальны для каждого процесса запущенного в системе.

Могу привести свою реализацию соответствующих функций, не претендующих на полноту smile


Код

function IsAbsolutePath (const Path :String) :Boolean;
 // Возвращает True если в Path указан абсолютный путь. Т.е. путь
 // начинается либо с имени устройства, либо с имени машины, либо
 // с корневого каталога.
 // Пустая строка не считается абсолютным путем.
begin
 Result :=   ((Length(Path) > 0) and (Path[1] = PathDelim ))
          or ((Length(Path) > 1) and (Path[2] = DriveDelim))   ;
end;

function IsRelPath (const Path :String) : Boolean;
 // Возвращает True если в Path указан относительный путь. (not IsAbsolutePath)
 // Пустая строка считается относительным путем.
begin
 Result := not IsAbsolutePath(Path);
end;

function IsDevicedPath (const Path :String) :Boolean;
 // Возвращает True если путь начинается с имени устройства.
begin
 Result := (Length(Path) >= 2) and (Upcase(Path[1]) in ['A'..'Z']) and (Path[2] = ':')   ;
end;

function IsLocalPath (aPath :String) :Boolean;
 // Возвращает True если путь aPath на локальном устройстве.
begin
 Result := (Pos('\\',aPath)<>1) and (ExpandUNCFileName(aPath)=ExpandFileName(aPath));
end;


PathDelim и DriveDelim определены в SysUtils. Если не хочется "тянуть" его за собой, просто добавьте
Код

const
 PathDelim  = {$IFDEF MSWINDOWS} '\'; {$ELSE} '/'; {$ENDIF}
 DriveDelim = {$IFDEF MSWINDOWS} ':'; {$ELSE} '';  {$ENDIF}
 PathSep    = {$IFDEF MSWINDOWS} ';'; {$ELSE} ':'; {$ENDIF}



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Akina
Дата 18.1.2005, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Давайте вспомним еще о специальных девайсах и путях...
about:blank - это относительный путь или абсолютный?
file:\manuals\readme.txt - это относительный путь или абсолютный?

Критерий абсолютности пути таков:

Вызываем функцию преобразования имени в абсолютное имя.
Меняем текущее устройство и повторяем процедуру.
При совпадении результатов путь - абсолютный, иначе относительный.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Snowy
Дата 18.1.2005, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Я думаю, что все гораздо проще:
if (copy(path,1,2)='\\') or (copy(path,2,2)=':\')
вот так действительно только абсолютные,
если считать, что абсолютный - точное указание пути, без учета текущего Dir'a.
Тут только полный сетевой путь или полный путь на драйве. Все осальное суета.
а всякие about:blank - это не абсолютные пути, а синонимы.

Это сообщение отредактировал(а) Snowy - 18.1.2005, 12:19
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.