![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Имя файла [D6, D7, WinXP]
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. Имхо.