Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.005 c
3-90487
VLL
2002-02-01 09:39
2002.02.28
Как упаковать таблицу


7-90678
ISA
2001-11-25 12:40
2002.02.28
Работа с COM-портом


14-90638
Смит&Вессон
2002-01-11 19:33
2002.02.28
Исходники игрушек


4-90706
Death
2001-12-27 02:02
2002.02.28
XPDesign


1-90562
SkyR
2002-02-08 01:50
2002.02.28
TQuickReport





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский