Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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;
> 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.038 c
9-1104597582
макс
2005-01-01 19:39
2005.03.27
Вопрос по 3dmax-у.


14-1109934092
Sash
2005-03-04 14:01
2005.03.27
nbtstat -r


1-1110443098
ser35
2005-03-10 11:24
2005.03.27
Строки DBGrid


1-1111010691
Гость
2005-03-17 01:04
2005.03.27
Как писать что-нибудь в n-ной колонки ListView?


14-1110053626
Vasya.ru
2005-03-05 23:13
2005.03.27
Помогите найти алгоритм





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