Текущий архив: 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.52 MB
Время: 0.005 c