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

Вниз

Обрезание расширений   Найти похожие ветки 

 
demon ©   (2008-11-24 17:14) [0]

Есть TStringList с 8000 именами файлов с расширением.
Как быстрее всего обрезать расширения у имен файлов?


 
clickmaker ©   (2008-11-24 17:17) [1]

выравнять по точкам в расширениях и ножичком.

быстрее всего их туда добавлять уже без расширений.


 
demon ©   (2008-11-24 17:23) [2]

ok, так и сделаю, только как быстрее всего это обрезать?
я делал так:
           s:=extractfilename(s);
           delete(s, length(s)-3, 4);
           ListBox1.Items[i]:=s;

Но это ведь неверно...


 
clickmaker ©   (2008-11-24 17:28) [3]

ну да, неверно
хотя бы потому, что расширение не обязательно 3 символа


 
Германн ©   (2008-11-24 17:38) [4]

ChangeFileExt поможет ОРД.


 
demon ©   (2008-11-24 17:41) [5]

Единственные путь что я вижу это измерить длинну строки вернутой ExtractFileExt и обрезать такое же количество символов с конца.
Или можно более грамотно?


 
clickmaker ©   (2008-11-24 17:44) [6]

> Или можно более грамотно?

найти последнюю точку
скопировать все, что до нее
либо удалить все, что после нее


 
DVM ©   (2008-11-24 17:45) [7]

Вот про обрезание http://www.freeimagehosting.net/uploads/1ebfc942c6.jpg

А если серьезно:

function ExtractFileNameWoExt(const FileName : string) : string;
begin
 Result := ExtractFileName(FileName);
 Result := Copy( Result, 1, Length(Result) - Length(ExtractFileExt(Result)));
end;


 
demon ©   (2008-11-24 17:51) [8]

А если делать не через функцию, а непосредственно, это ведь сэкономит некоторое время?


 
DVM ©   (2008-11-24 17:53) [9]


> это ведь сэкономит некоторое время?

Сэкономит, но имхо ловля блох. Самый быстрый вариант - начиная с конца строки искать точку, если найдена, то усекаем строку до точки, если не найдена, то ничего не делаем.


 
Германн ©   (2008-11-24 17:54) [10]

А чем всё-таки ChangeFileExt не устраивает?


 
clickmaker ©   (2008-11-24 18:03) [11]

> Самый быстрый вариант - начиная с конца строки искать точку,
> если найдена, то усекаем строку до точки

хм.. может, так?

dot := LastDelimiter(".", filename);
if (dot > 0) then
 filename[dot] := #0;


 
DevilDevil   (2008-11-24 18:06) [12]

мда...

var
 S: string;
 i: integer;

 for i := Length(S) downto 1 do
 if (S[i] = ".") then
 begin
   SetLength(S, i-1) ;
   break;
 end;


Это почти самый быстрый способ на ЯВУ с учётом, что файл обладает расширением.


 
DevilDevil   (2008-11-24 18:06) [13]

> clickmaker ©   (24.11.08 18:03) [11]
некорректно.


 
DVM ©   (2008-11-24 18:08) [14]

а как быть с файлами, у которых имена типа .htaccess  ?


 
clickmaker ©   (2008-11-24 18:13) [15]

> а как быть с файлами, у которых имена типа .htaccess

в семье не без урода. Не повезло им :)


 
Правильный$Вася   (2008-11-24 18:16) [16]


> у которых имена типа .htaccess  ?

или типа "моя не понимать......."


 
Плохиш ©   (2008-11-24 18:38) [17]


> Германн ©   (24.11.08 17:54) [10]

Ну ты настырный :-)


 
palva ©   (2008-11-24 19:23) [18]

В Windows есть ограничение на длину расширений. По-моему 5 символов. То есть .shtml это еще расширение, а если символов больше, то файл должен считаться как не имеющий расширения. Наверно есть и другие нюансы, которые могут измениться в будущих версиях Windows. Так что лучше пользоваться готовыми функциями.


 
Anatoly Podgoretsky ©   (2008-11-24 19:35) [19]

file.manifest

Нет ни ограничений, ни расширений - это только видимость и есть поддержка этой видимости.


 
clickmaker ©   (2008-11-24 19:47) [20]

> В Windows есть ограничение на длину расширений. По-моему
> 5 символов

да ладно. Где об этом сказано?


 
palva ©   (2008-11-24 20:46) [21]


> да ладно. Где об этом сказано?

Где-то читал такое. Хотя сейчас попробовал зарегистрировать расширение из семи букв - и все работает - на него запускается блокнот.
Может быть это касалось Windows 98, может быть ext3, а может быть вообще была ошибка автора книги.


 
Virgo_Style ©   (2008-11-24 22:09) [22]

imho есть уж ловить блох - то стоит подумать над тем, как обойтись без перевыделения памяти 8000 раз, или я ошибаюсь?


 
palva ©   (2008-11-24 22:49) [23]


> как обойтись без перевыделения памяти

Если это строка, то можно просто укоротить строку при помощи SetLength. А вот если это индексированное свойство стринглиста, тогда есть сомнения, что такая штука сработает.


 
Германн ©   (2008-11-25 01:47) [24]


> Плохиш ©   (24.11.08 18:38) [17]
>
>

Не. Я не настырный. Я вредный! :)
И по "вредности" считаю, что я второй после АП. (Кэтмар где-то потерялся. В "Украинских пустынях", наверно.:)


 
Virgo_Style ©   (2008-11-25 16:03) [25]

palva ©   (24.11.08 22:49) [23]
А вот если это индексированное свойство стринглиста, тогда есть сомнения, что такая штука сработает.


Смотря какая штука. Копируем .Text в строку-буфер, выделяем еще один буфер под строку-результат и... начинаем думать над правилами переноса из первой во вторую. Но вроде ничего такого волшебного в ней быть не должно.


 
Virgo_Style ©   (2008-11-25 16:19) [26]

А вроде и ничего сложного... по крайней мере, на бумаге.

пусть исходная строка Src, новая New;
NewPos - "указатель" на текущий символ строки-результата,
SrcPos - "указатель" на текущий символ в строке-исходнике,
в DlmPos будем запоминать позицию крайнего разделителя имя-расширение

Проход по исходной строке от начала к концу SrcPos = 1..Length(Src) :

 если Src[SrcPos] = разделитель имя-расширение ("."), то DlmPos = NewPos;
 если Src[SrcPos] = разделитель имен (#13 и/или #10), то
   если DlmPos>0, то NewPos = DlmPos;
   DlmPos = 0;

 копируем символ из Src[SrcPos] в New[NewPos]
 inc(SrcPos);
 inc(NewPos);

Как-то так, если нигде не лопухнулся.


 
Юрий Зотов ©   (2008-11-25 17:12) [27]

Конечно, левое ухо можно чесать не только левой рукой. Хоть правой ногой, если кому это нравится.

Но ChangeFileExt все же удобнее.


 
Palladin ©   (2008-11-25 18:32) [28]

А главное - с его использованием понятно, что же в коде происходит :)
А то потом... отделить ногу от уха, пробежатся по ноге, уйти в никуда, добежать обратно до предыдущей точки соприкосновения ноги с ухом, выяснить что это часть маникена, побежать до точки соединения с маникеном, увидеть соседа справа, и выяснить что это его рука, только бритая...


 
Плохиш ©   (2008-11-25 18:45) [29]


> Virgo_Style ©   (25.11.08 16:19) [26]



> Проход по исходной строке от начала к концу SrcPos = 1..
> Length(Src) :

А пойти от конца к началу религия не позволяет, о великийизобретательвелосипедастреугольнымиколёсами?


 
palva ©   (2008-11-25 22:37) [30]


> о великийизобретательвелосипедастреугольнымиколёсами

Бывают такие дороги, добиться плавности хода по которым можно только изобретя треугольные колеса. Увы.


 
Palladin ©   (2008-11-25 23:27) [31]

;) увы, авторы тех дорог сродни авторам треугольносипедов...


 
Германн ©   (2008-11-26 04:17) [32]


> palva ©   (25.11.08 22:37) [30]
>
>
> > о великийизобретательвелосипедастреугольнымиколёсами
>
> Бывают такие дороги, добиться плавности хода по которым
> можно только изобретя треугольные колеса. Увы.

Не надо ездить (ходить)  по таким дорогам.


 
Virgo_Style ©   (2008-11-26 11:10) [33]

Плохиш ©   (25.11.08 18:45) [29]
А пойти от конца к началу религия не позволяет


Сначала я подумал именно о таком варианте, но отбросил его как неоптимальный. Я был бы безмерно благодарен, если бы драгоценный преждерожденный пояснил бы, почему это не так.



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

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

Наверх




Память: 0.55 MB
Время: 0.018 c
2-1228066081
Pavel
2008-11-30 20:28
2009.01.11
Как из пути извлечь имя последнего каталога?


15-1226665932
Dmitry S
2008-11-14 15:32
2009.01.11
Книга по Flash ActiveScript 3.0


8-1189093100
chipper
2007-09-06 19:38
2009.01.11
Чтение avi или gif файла


15-1226186059
Petr V. Abramov
2008-11-09 02:14
2009.01.11
ну теперь продажи пойдут


2-1227717552
KTA
2008-11-26 19:39
2009.01.11
Переход на новую страницу