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

Вниз

Поиск файлов   Найти похожие ветки 

 
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;
> end

uses 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.045 c
1-1110624874
Checist [root]
2005-03-12 13:54
2005.03.27
ShowWindow глючит?


6-1106577869
Urvin
2005-01-24 17:44
2005.03.27
Клиент-сервер


14-1110107557
Stany
2005-03-06 14:12
2005.03.27
как закрыть загрузочное меню по F8 в NT?


3-1109584878
Layner
2005-02-28 13:01
2005.03.27
Как RAISERROR словить в своей программе?


1-1110630898
X-Disa
2005-03-12 15:34
2005.03.27
Динамически создать форму