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

Вниз

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

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

Наверх





Память: 0.52 MB
Время: 0.006 c
15-1226827602
Slider007
2008-11-16 12:26
2009.01.11
С днем рождения ! 15 ноября 2008 суббота


2-1227704235
ekto
2008-11-26 15:57
2009.01.11
не работают сплиттеры


1-1205180556
mr. Eof
2008-03-10 23:22
2009.01.11
Проблема с таймером


3-1212598398
Цукор5
2008-06-04 20:53
2009.01.11
FireBird 1.5 & Vista ?


2-1227961713
AlexDan
2008-11-29 15:28
2009.01.11
Программно выключить дсплей..





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский