![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск файлов [D6, WinXP]
John © (2005-03-09 20:35:00)Подскажите пож-ста:
как програмно искать файлы по нескольким расширениям?
Anatoly Podgoretsky (2005-03-11 12:09:00) [1]John (11.03.05 09:40) [37]
А пожалуйста, применяй.
John (2005-03-11 09:40:00) [2]
> Anatoly Podgoretsky © (10.03.05 21:32) [32]
> А что надо применить то?
ExtractFileExt.
vertal (2005-03-10 22:32:00) [3]Я бы делал так:
Сделал бы отсортированный массив расширений, после поиска по маске *.* - ExtractFileExt и попытка найти его двоичным поиском в этом массиве (это если без подстановочных знаков). С подстановочными знаками видимо придется проверять каждый шаблон на соответствие найденному расширению, если не закапываться глубоко в эти алгоритмы. Лучше с точки зрения производительности перед поиском создать ряд объектов TMask и юзать их метод Matches, а не вызывать по сто раз функцию MatchesMask, которая все равно создает этот объект. Глюков в работе TMask не замечал, но в крайнем случае можно по очереди искать через FindFirst/FindNext по каждому шаблону отдельно.
А то, что у rolex'а эта функция глючит, и притом нерегулярно, наводит меня на мысль, что у него где-то в программе в другом потоке есть 'потерявшийся' указатель, запись по которому приводит к порче внутренних структур у TMask.
Zeqfreed (2005-03-10 22:18:00) [4]rolex (10.03.05 22:12) [34]
Я тебя ничего не просил доказывать. А то, что какая-то прога глючит - меня совсем не волнует; я сделал проверку - результатами удовлетворен.
rolex (2005-03-10 22:12:00) [5]О! Получилось! Со 2-го раза появился файл!
Вот скриншот: http://www.rolex.fatal.ru/delphigluck.gif
Если ты думаешь, что тут я работал графическим редактором, то это уже твоё дело. Я устал доказывать.
rolex (2005-03-10 22:01:00) [6]To ZeqfreedЯ незнаю как это объяснить и чем это объяснить. Но ФАКТ остаётся фактом. Потомучто эти явления вылазили и в моей программе, и на форуме ты сам видел человек написал, да и автор программы DiskCleaner заметил это. Может быть это имя файла как-нибудь неправильно иногда выводится или считывается, ну незнаю я как это объяснить!
А если хочешь сам убедиться, скачай утилиту Disk Cleaner (~700Kb) добавь маску "*.??$" и создай где-нить на диске файл "zxvsdf.h" и сканируй его этой прогой несколько раз. Т.е. тыкай кнопку "Начать поиск", потом опять и так далее.
Тут я уже гарантирую явление! Потомучто я также делал и у меня вывелись эти файлы (причём кстати с первого раза, потом скока не нажимал, не появлялись).
P.S. Моя файловая сис-ма NTFS, ОС - WinXP без SP. Это так, на всякий случай.
P.S.S. Пойду опять попробую потыкать "Начать сканирование", чтобы точно убедиться.
Anatoly Podgoretsky (2005-03-10 21:32:00) [7]А что надо применить то?
John (2005-03-10 21:31:00) [8]
> 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 + '\';
..и т.д
Zeqfreed (2005-03-10 21:05:00) [9]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;
Обащаного чуда я не увидел.
rolex (2005-03-10 20:38:00) [10]
> 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(вторая месага в топике).
Anatoly Podgoretsky (2005-03-10 20:05:00) [11]John (10.03.05 18:52) [25]
Какому коду. delphi.mastak.ru БОЛЬШОЙ
Zeqfreed (2005-03-10 19:34:00) [12]rolex (10.03.05 19:27) [26]
Если траву курить, то ещё и не только TRUE!!! вылезет, но и MAYBE.
rolex (2005-03-10 19:27:00) [13]
> AlienX (10.03.05 18:40) [24]
> После того, как получил файл - попробуй дополнительно проверить
> ф-цией MatchesMask - она правильно работает.
Я бы не сказал.
В Дельфи вообще чудеса творятся! Например при использовании функции MatchesMask ИНОГДА(!) выводится true для файла с расширением ".h" а маска стоит ".??$" вот так вот! Причём чудо в том, что ИНОГДА. Т.е. если создать программу, которая к примеру, по нажатии Button1 будет проверять соответствует ли файл "qwerty.h" маске ".??$" при помощи функции MatchesMask, то нажав на кнопку вылезет false, а если ещё несколько раз нажимать на кнопку то может после 1,2,...10...100 раза, это когда как, функция выдаст TRUE!!!
John (2005-03-10 18:52:00) [14]Вопрос к Anatoly Podgoretsky, а как это применить к Вашему коду
апубликованному в delphi.mastak.ru?
AlienX (2005-03-10 18:40:00) [15]После того, как получил файл - попробуй дополнительно проверить ф-цией MatchesMask - она правильно работает.
Antonn (2005-03-10 17:55:00) [16]begin...end © (10.03.05 17:49) [22]
А, ну да, так вернет, а вот с р3 не вернет:) Выходит, не такая уж универсальня функция...
begin...end (2005-03-10 17:49:00) [17]> Antonn © (10.03.05 17:37) [21]
Пусть параметр nameравен "file.mp", а параметр maskравен "*.mp3". Функция [12] вернёт True.
Так что же получается - что имя файла "file.mp" удовлетворяет маске "*.mp3"?
Antonn (2005-03-10 17:37:00) [18]begin...end © (10.03.05 17:27) [19]
А Ваша функция из [12] может работать неправильно. Например, у файла может быть расширение "р3" (это вполне реальная ситуация, т.к. использование двухбуквенных расширений в Windows допустимо). Тогда Ваша функция возвратит True в случае параметра mask, равного "*.mp3". Разумеется, это неверно.
Почему 'p3'? Я ж Extractfileext делаю, будет '.p3'
_1 (2005-03-10 17:32:00) [19]По очереди.
begin...end (2005-03-10 17:27:00) [20]> Antonn © (10.03.05 9:36) [17]
> этот пример позволяет отсекать только по одному
> расширению
Тем не менее, можно вызвать эту функцию для каждого интересующего расширения. Или усовершенствовать её, передавая в качестве параметра не одно расширение, а их список (например, TStringList).
А Ваша функция из [12] может работать неправильно. Например, у файла может быть расширение "р3" (это вполне реальная ситуация, т.к. использование двухбуквенных расширений в Windows допустимо). Тогда Ваша функция возвратит True в случае параметра mask, равного "*.mp3". Разумеется, это неверно.