Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Имя файла [D6, D7, WinXP]


Страницы:   1 2

Ivolg ©   (2004-06-14 19:07:00) 

как мона получить имя файла без его расширения. Спасибо!!!


RealRascal   (2004-06-15 17:52:00) [1]

По названию этой функции я решил, что она изменяет расширение файла физически, т.е. на диске... Все, посмотрел в хелпе,
function ChangeFileExt(const FileName, Extension: string): string;


Anatoly Podgoretsky   (2004-06-15 17:47:00) [2]

А зачем все это, при наличии штатной функции ChangeFileExt


RealRascal   (2004-06-15 17:44:00) [3]

Угу... Просто это первое что пришло в голову... Значит надо заменить StringReplace на функцию, которя делает замену начиная с определенного символа, не помню как называется...


Anatoly Podgoretsky   (2004-06-15 17:37:00) [4]

RealRascal ©   (15.06.04 17:34) [27]
Ну ты даешь, вот вполне нормалное имя doc.doc.doc


RealRascal   (2004-06-15 17:34:00) [5]

FunctionGetNameWithoutExt(Filename: string): string;
begin
Result:=StringReplace(Extractfilename(filename),ExtractFileExt(filename),'',[rfIgnoreCase])
end;

Не проверял. Возможно, придется точку добавить к расширению при замене


GuAV   (2004-06-15 00:07:00) [6]

Default = 1500, Default_Tower = 1520, Tower_orig = 1021, Piter = 1700, Tower = 975
Default_Tower - [19]
Tower_orig - без "подрихтовал его вариант" - через Delete.


default   (2004-06-14 23:06:00) [7]

jack128 ©   (14.06.04 22:46) [24]
меня "сподвигнули" на ту фразу воспоминания о трёхсимвольных(максимально) расширениях в дос...


jack128   (2004-06-14 22:46:00) [8]


> прикол...я вообще не соревновался ни с кем

Просто твоя фраза про основной тормоз меня заинтересовала.. Так что, как видишь, не такой уж это и тормоз ;-)
ExtractFileExt - тоже самое делает, но с кой какими заморочками, поэтому и медленее..


default   (2004-06-14 22:42:00) [9]

прикол...я вообще не соревновался ни с кем, тот вариант был как минимальный код...ну да ладно


jack128   (2004-06-14 22:30:00) [10]


> while (i>0)and (filename[i]<>'.') do i:=i-1;
> если расш-ие не указано и строка немаленькая, то пока i
> <> 0 цикл будет бестолку крутиться

а, что есть другие варианты решить подобную задачу?
Я, если Tower не против, подрихтовал его вариант и он стал победителем ;-)

function Tower(FileName: string): string;
var
 i: Integer;
begin
 Result := ExtractFileName(FileName);
 i := Length(Result);
 while (i > 0) and (Result[i] <> '.') do i:=i-1;
 if i > 0 then
   SetLength(Result, i - 1);
end;

function Default(FileName: string): string;
begin
 Result := ExtractFileName(ChangeFileExt(FileName, ''));
end;

function Piter(FileName: string) : string;
var
i:integer;
s:string;
begin
s := ExtractFileName(FileName);
i := length(ExtractFileExt(FileName));
Result := copy(s, 1,  length(s) - i);
end;

procedure TForm1.Button1Click(Sender: TObject);
const
 N = 1000000;
 fn = 'c:\ fifhed\fhkldj\coc3fe9.lsafs';
var
 tPiter, tDefault, tTower: Cardinal;
 i: Integer;
 s: string;
begin
 tDefault := GetTickCount;
 for i := 0 to N do
   s := Default(fn);
 tDefault := GetTickCount - tDefault;
 Memo1.Lines.Add(s);
 tPiter := GetTickCount;
 for i := 0 to N do
   s := Piter(fn);
 tPiter := GetTickCount - tPiter;
 Memo1.Lines.Add(s);
 tTower := GetTickCount;
 for i := 0 to N do
   s := Tower(fn);
 tTower := GetTickCount - tTower;
 Memo1.Lines.Add(s);
 Caption := Format('Default = %d, Piter = %d, Tower = %d', [tDefault, tPiter, tTower]); // 2744, 3535, 2183
end;


> при чем здесь вообще jack128?
вот поэтому ;-)


Piter   (2004-06-14 22:01:00) [11]

при чем здесь вообще jack128?


GuAV   (2004-06-14 20:58:00) [12]

Меняем биты в байте ? ;-) jack128, результат измерений в студию 8-)


tower   (2004-06-14 20:40:00) [13]

Может так оптимальней?
ChangeFileExt(ExtractFileName(FileName), '')


Piter   (2004-06-14 20:33:00) [14]

В общем, оптимальным будет считать:

ExtractFileName(ChangeFileExt(FileName, ''))

к тому же, она работает быстрее, чем мой вариант...


default   (2004-06-14 20:25:00) [15]

на мой взгляд неоптим-ть в строке
while (i>0)and (filename[i]<>'.') do i:=i-1;
если расш-ие не указано и строка немаленькая, то пока i <> 0 цикл будет бестолку крутиться


tower   (2004-06-14 20:24:00) [16]

Piter(14.06.04 20:22) [14]

Согласен.


GuAV   (2004-06-14 20:22:00) [17]


> function ExtractFileNameWithoutExt(FileName: string) : string;
> var
>  i:integer;
>  s:string;
> begin
>  s := ExtractFileName(FileName);
>  i := length(ExtractFileExt(FileName));
>  Result := copy(s, 1,  length(s) - i);
> end;

Зачем так путать? Нельзя ли попроще?


Piter   (2004-06-14 20:22:00) [18]

default (14.06.04 20:17) [11]

логично :)


Piter   (2004-06-14 20:20:00) [19]

Не, не так...

function ExtractFileNameWithoutExt(FileName: string) : string;
var
 i:integer;
 s:string;
begin
 s := ExtractFileName(FileName);
 i := length(ExtractFileExt(FileName));
 Result := copy(s, 1,  length(s) - i);
end;


GuAV   (2004-06-14 20:17:00) [20]


> delete(filename,i,length(filename)-i+1);

не оптимальный код и ошибка скорее всего здесь (не уверен, мне лень её искать). Лучше SetLength. Имхо.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо