Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
ВнизПоиск файлов Найти похожие ветки
← →
John (2005-03-09 20:35) [0]Подскажите пож-ста:
как програмно искать файлы по нескольким расширениям?
← →
Fay © (2005-03-09 20:38) [1]Представь, что хочешь купить в автомате и кофе, и чай с лимоном.
← →
begin...end © (2005-03-09 20:40) [2]С помощью функций FindFirst/FindNext/FindClose. Искать по маске *.* и отфильтровывать ненужные файлы в зависимости от расширения, которое можно определять с помощью функции ExtractFileExt.
← →
ламер_ (2005-03-09 20:42) [3]Так же, как в OpenDialog реализуется свойство Filter
← →
John (2005-03-09 22:03) [4]
> С помощью функций FindFirst/FindNext/FindClose. Искать по
> маске *.* и отфильтровывать ненужные файлы в зависимости
> от расширения, которое можно определять с помощью функции
> ExtractFileExt.
А по подробнее насчёт ExtractFileExt если можно, а то у меня что-то не вяжется?
← →
begin...end © (2005-03-09 22:04) [5]> John (09.03.05 22:03) [4]
А можно поподробнее насчёт того, что у Вас не вяжется?
← →
John (2005-03-09 22:30) [6]Не могу правильно воткнуть эту функцию.
← →
Fay © (2005-03-09 22:37) [7]>> Не могу правильно воткнуть эту функцию.
Сверните её в трубочку.
← →
Anatoly Podgoretsky © (2005-03-09 22:44) [8]А пролезет?
← →
Fay © (2005-03-09 22:46) [9]2 Anatoly Podgoretsky © (09.03.05 22:44) [8]
Это зависит от того, куда втыкивать.
← →
ламер_ © (2005-03-09 22:54) [10]ИМХО, это зависит и от расширения - если .exe- сам себя пропихнет, а если html- то канал придется расширять :)).
← →
Anatoly Podgoretsky © (2005-03-09 22:54) [11]Значит дырочка неправильная.
← →
Antonn © (2005-03-10 06:14) [12]function Check_File(name, mask: string): boolean;
var
Ext: string;
begin
ext := lowercase(ExtractFileExt(name));
if pos(ext, lowercase(mask) ) > 0 then
result:=true else result:=false;
end;
маска вида "*.wav;*.mp3;*.ogg", ну что то в таком виде
← →
John (2005-03-10 07:45) [13]Приятно что в это разделе форума то-же есть свои "Плахиши"!
Всем спасибо(Antonn в частности).
← →
begin...end © (2005-03-10 08:18) [14]> Antonn © (10.03.05 6:14) [12]
> var
> Ext: string;
> begin
> ext := lowercase(ExtractFileExt(name));
> if pos(ext, lowercase(mask) ) > 0 then
> result:=true else result:=false;
> enduses Masks;
begin
Result := MatchesMask(name, mask)
end
Но автор ветки хотел искать именно по расширениям, а не по полноценным маскам, поэтому в его случае достаточно будет такого:function CheckFile(Name, Ext: string): Boolean;
begin
Result := ANSILowerCase(ExtractFileExt(Name)) = ANSILowerCase(Ext)
end
Здесь Ext - обычное расширение, напр.: exe.
← →
Antonn © (2005-03-10 09:22) [15]begin...end © (10.03.05 8:18) [14]
нескольким расширениям?
вот.
← →
Anatoly Podgoretsky © (2005-03-10 09:24) [16]Antonn © (10.03.05 09:22) [15]
А ты не заметил, что у него функция с параметрами?
← →
Antonn © (2005-03-10 09:36) [17]Anatoly Podgoretsky © (10.03.05 9:24) [16]
не понял вопроса. Автор просил искать файлы по нескольким расширениям. Думаю сам поиск он выполнит, останется отсечь файлы с нужным расширением.
>function CheckFile(Name, Ext: string): Boolean;
>begin
> Result := ANSILowerCase(ExtractFileExt(Name)) =
>ANSILowerCase(Ext)
>end;
> Здесь Ext - обычное расширение, напр.: exe.
этот пример позволяет отсекать только по одному расширению(насколько я понял). Потому и пихнул Х15Ъ
← →
Anatoly Podgoretsky © (2005-03-10 09:39) [18]Еще раз функция с параметрами?
← →
begin...end © (2005-03-10 17:27) [19]> Antonn © (10.03.05 9:36) [17]
> этот пример позволяет отсекать только по одному
> расширению
Тем не менее, можно вызвать эту функцию для каждого интересующего расширения. Или усовершенствовать её, передавая в качестве параметра не одно расширение, а их список (например, TStringList).
А Ваша функция из [12] может работать неправильно. Например, у файла может быть расширение "р3" (это вполне реальная ситуация, т.к. использование двухбуквенных расширений в Windows допустимо). Тогда Ваша функция возвратит True в случае параметра mask, равного "*.mp3". Разумеется, это неверно.
← →
_1 (2005-03-10 17:32) [20]По очереди.
← →
Antonn © (2005-03-10 17:37) [21]begin...end © (10.03.05 17:27) [19]
А Ваша функция из [12] может работать неправильно. Например, у файла может быть расширение "р3" (это вполне реальная ситуация, т.к. использование двухбуквенных расширений в Windows допустимо). Тогда Ваша функция возвратит True в случае параметра mask, равного "*.mp3". Разумеется, это неверно.
Почему "p3"? Я ж Extractfileext делаю, будет ".p3"
← →
begin...end © (2005-03-10 17:49) [22]> Antonn © (10.03.05 17:37) [21]
Пусть параметр name равен "file.mp", а параметр mask равен "*.mp3". Функция [12] вернёт True.
Так что же получается - что имя файла "file.mp" удовлетворяет маске "*.mp3"?
← →
Antonn © (2005-03-10 17:55) [23]begin...end © (10.03.05 17:49) [22]
А, ну да, так вернет, а вот с р3 не вернет:) Выходит, не такая уж универсальня функция...
← →
AlienX (2005-03-10 18:40) [24]После того, как получил файл - попробуй дополнительно проверить ф-цией MatchesMask - она правильно работает.
← →
John (2005-03-10 18:52) [25]Вопрос к Anatoly Podgoretsky, а как это применить к Вашему коду
апубликованному в delphi.mastak.ru?
← →
rolex (2005-03-10 19:27) [26]
> AlienX (10.03.05 18:40) [24]
> После того, как получил файл - попробуй дополнительно проверить
> ф-цией MatchesMask - она правильно работает.
Я бы не сказал.
В Дельфи вообще чудеса творятся! Например при использовании функции MatchesMask ИНОГДА(!) выводится true для файла с расширением ".h" а маска стоит ".??$" вот так вот! Причём чудо в том, что ИНОГДА. Т.е. если создать программу, которая к примеру, по нажатии Button1 будет проверять соответствует ли файл "qwerty.h" маске ".??$" при помощи функции MatchesMask, то нажав на кнопку вылезет false, а если ещё несколько раз нажимать на кнопку то может после 1,2,...10...100 раза, это когда как, функция выдаст TRUE!!!
← →
Zeqfreed © (2005-03-10 19:34) [27]rolex (10.03.05 19:27) [26]
Если траву курить, то ещё и не только TRUE!!! вылезет, но и MAYBE.
← →
Anatoly Podgoretsky © (2005-03-10 20:05) [28]John (10.03.05 18:52) [25]
Какому коду. delphi.mastak.ru БОЛЬШОЙ
← →
rolex (2005-03-10 20:38) [29]
> Zeqfreed © (10.03.05 19:34) [27]
> rolex (10.03.05 19:27) [26]
> Если траву курить, то ещё и не только TRUE!!! вылезет, но
> и MAYBE.
Мля ну попробуй!
А подтвердить это может уже готовая программа (DiskCleaner). Программа написана на Delphi и предназначена для очистки мусора из винта (посик по маскам). В программе поддерживается добавление пользовательских масок, т.е. добавь туды "*.??$" и убедись.
А во вторых http://www.softboard.ru/index.php?act=ST&f=9&t=16275 (вторая месага в топике).
← →
Zeqfreed © (2005-03-10 21:05) [30]rolex (10.03.05 20:38) [29]
procedure TForm1.Button1Click(Sender: TObject);
var
i : Cardinal;
b : boolean;
begin
i := 0;
repeat
Inc(i);
b := MatchesMask("qwerty.h", "*.??$");
listBox1.Items.Add(BoolToStr(b, true));
if b then begin
ShowMessage("Чудо случилось на " + IntToStr(i + 1) + "-ой итерации");
Break;
end;
if (i mod 100) = 0 then begin
Caption := IntToStr(i + 1);
Application.ProcessMessages;
end;
until not checkbox1.Checked;
end;
Обащаного чуда я не увидел.
← →
John (2005-03-10 21:31) [31]
> Anatoly Podgoretsky © (10.03.05 20:05) [28]
> John (10.03.05 18:52) [25]
> Какому коду. delphi.mastak.ru БОЛЬШОЙ
Procedure ScanDir(StartDir: String; Mask:string; List:TStrings);
{ Процедура выводит список директории в список List, начиная с директории, указанной в StartDir. Mask - маска для получения файлов
Источник delphi.mastak.ru
© А. Подгорецкий }
Var SearchRec : TSearchRec;
Begin
IF Mask ="" then Mask:= "*.*";
IF StartDir[Length(StartDir)] <> "\" then StartDir := StartDir + "\";
..и т.д
← →
Anatoly Podgoretsky © (2005-03-10 21:32) [32]А что надо применить то?
← →
rolex (2005-03-10 22:01) [33]To Zeqfreed Я незнаю как это объяснить и чем это объяснить. Но ФАКТ остаётся фактом. Потомучто эти явления вылазили и в моей программе, и на форуме ты сам видел человек написал, да и автор программы DiskCleaner заметил это. Может быть это имя файла как-нибудь неправильно иногда выводится или считывается, ну незнаю я как это объяснить!
А если хочешь сам убедиться, скачай утилиту Disk Cleaner (~700Kb) добавь маску "*.??$" и создай где-нить на диске файл "zxvsdf.h" и сканируй его этой прогой несколько раз. Т.е. тыкай кнопку "Начать поиск", потом опять и так далее.
Тут я уже гарантирую явление! Потомучто я также делал и у меня вывелись эти файлы (причём кстати с первого раза, потом скока не нажимал, не появлялись).
P.S. Моя файловая сис-ма NTFS, ОС - WinXP без SP. Это так, на всякий случай.
P.S.S. Пойду опять попробую потыкать "Начать сканирование", чтобы точно убедиться.
← →
rolex (2005-03-10 22:12) [34]О! Получилось! Со 2-го раза появился файл!
Вот скриншот: http://www.rolex.fatal.ru/delphigluck.gif
Если ты думаешь, что тут я работал графическим редактором, то это уже твоё дело. Я устал доказывать.
← →
Zeqfreed © (2005-03-10 22:18) [35]rolex (10.03.05 22:12) [34]
Я тебя ничего не просил доказывать. А то, что какая-то прога глючит - меня совсем не волнует; я сделал проверку - результатами удовлетворен.
← →
vertal © (2005-03-10 22:32) [36]Я бы делал так:
Сделал бы отсортированный массив расширений, после поиска по маске *.* - ExtractFileExt и попытка найти его двоичным поиском в этом массиве (это если без подстановочных знаков). С подстановочными знаками видимо придется проверять каждый шаблон на соответствие найденному расширению, если не закапываться глубоко в эти алгоритмы. Лучше с точки зрения производительности перед поиском создать ряд объектов TMask и юзать их метод Matches, а не вызывать по сто раз функцию MatchesMask, которая все равно создает этот объект. Глюков в работе TMask не замечал, но в крайнем случае можно по очереди искать через FindFirst/FindNext по каждому шаблону отдельно.
А то, что у rolex"а эта функция глючит, и притом нерегулярно, наводит меня на мысль, что у него где-то в программе в другом потоке есть "потерявшийся" указатель, запись по которому приводит к порче внутренних структур у TMask.
← →
John (2005-03-11 09:40) [37]
> Anatoly Podgoretsky © (10.03.05 21:32) [32]
> А что надо применить то?
ExtractFileExt.
← →
Anatoly Podgoretsky © (2005-03-11 12:09) [38]John (11.03.05 09:40) [37]
А пожалуйста, применяй.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.038 c