Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.28;
Скачать: CL | DM;

Вниз

Как найти каталог   Найти похожие ветки 

 
Basil ©   (2002-02-08 14:33) [0]

Подскажите пожалуйста, есть ли какая-нибудь функция, возвращающая путь к каталогу, если известен путь к подкаталогу в нем находящемуся.
Т.е. известно: "C:\VANJA\PETJA\"
нужно найти: "C:\VANJA\".


 
MBo ©   (2002-02-08 15:35) [1]

функции Pos и Copy спасут


 
Андрей Сенченко ©   (2002-02-08 16:05) [2]

Pos IMHO здесь не самый лучший подход. Возможно выстрее будет так:
function DoloiPetjuIsPutei(Otkuda : string) : string;
var
ch: char; // сюда пойдет последний символ.
st: string; // сюда запишим исходный путь.
begin
st := ExcludeTrailingBackslash(Otkuda);
repeat
delete(st,length(st),1);
ch := copy(st,length(st),1);
until ch = "\";
result := st
end;


 
Иван Шихалев ©   (2002-02-08 16:37) [3]

to Андрей Сенченко

Наимедленнейший способ, однако...

Есть такая функция (правда, в SysUtils) LastDelimiter. Если не хочется использовать громоздкий SysUtils, можно ее и самому написать. Все быстрее, чем на каждый символ Delete делать.


 
Андрей Сенченко ©   (2002-02-08 17:05) [4]

Иван Шихалев © (08.02.02 16:37)
Искать posза pos-ом скорее всего будет еще медленнее. Потому как заранее неизвестна вложенность директорий.
SysUnits, как Вы и сказали, сразу увеличивает размер программы до привычных Windows-у размеров, то есть сотни килобайт. А смысл ?
Опять же ... собственно
function LastDelimiter(const Delimiters, S: string): Integer;
var
P: PChar;
begin
Result := Length(S);
P := PChar(Delimiters);
while Result > 0 do
begin
if (S[Result] <> #0) and (StrScan(P, S[Result]) <> nil) then
{$IFDEF MSWINDOWS}
if (ByteType(S, Result) = mbTrailByte) then
Dec(Result)
else
Exit;
{$ENDIF}
{$IFDEF LINUX}
begin
if (ByteType(S, Result) <> mbTrailByte) then
Exit;
Dec(Result);
while ByteType(S, Result) = mbTrailByte do Dec(Result);
end;
{$ENDIF}
Dec(Result);
end;
end;

При достаточно большой вложенности - можно поспорить что быстрее.


 
Андрей Сенченко ©   (2002-02-08 17:09) [5]

Справедливости ради стоит запетить, что и
ExcludeTrailingBackslash
принадлежит SysUtils - ам, но ее можно обойти


 
Иван Шихалев ©   (2002-02-08 17:21) [6]

Думаю, что все-таки, Inc и Dec будут побыстрее удаления символа. Pos за Pos"ом может быть и медленнее, но не факт. Я обычно делаю простенькую реализацию LastDelimiter для одного символа (что быстрее).


 
Basil ©   (2002-02-11 11:24) [7]

Всем спасибо. Буду переваривать.



Страницы: 1 вся ветка

Текущий архив: 2002.02.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.007 c
4-90722
Black Wolf
2001-12-28 16:23
2002.02.28
Выбор информации подобно Event Viewer


3-90517
nata1
2002-02-01 11:43
2002.02.28
Вопрос по QReport


1-90561
novomod
2002-02-10 01:06
2002.02.28
Timage. Мерцание. Help.


14-90661
Иван Шихалев
2002-01-15 18:11
2002.02.28
---|Ветка была без названия|---


4-90694
C_M
2001-12-28 12:45
2002.02.28
Как заполнить ComboBox списком директорий? DlgDirListComboBox! Как она работает?