![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Найти файлы с определенным расширением [D5, D7, WinXP]
Sergey_R © (2005-09-20 13:33:00)Подскажите, пожалуйста, как найти в заданной папке все файлы с определнным расширением? Пробовал использовать Findfirst и Findnext, но что-то не получается :-(.
Sergey_R (2005-09-23 15:49:00) [1]Спасибо за ответы, но на каком-то сайте нашел рекурсивную функцию, которая все ищет!
IceBeerg (2005-09-21 16:37:00) [2]begin...end © (21.09.05 16:34) [16]
О! Оно! А ведь знал... Надо чаще пользоваться...
IceBeerg (2005-09-21 16:36:00) [3]Хотя, в прочем,
DirectoryExistsиIf FindFirst(Dir+'*.*',faAnyFile,SearchRec)=0заменит.
begin...end (2005-09-21 16:34:00) [4]> IceBeerg © (21.09.05 16:27) [15]
IncludeTrailingPathDelimiter
IceBeerg (2005-09-21 16:27:00) [5]Anatoly Podgoretsky © (21.09.05 16:12) [14]
Спасибо, я как то на эту строку внимания не обращал... вроде начальную директорию всегда сам задовал... да надо смотреть длиннуDirда иDirectoryExistsне помешает.
Anatoly Podgoretsky (2005-09-21 16:12:00) [6]Это путь к AV, поскольку это может выродиться в
If Dir[0]<>'\' Then Dir:=Dir+'\'; при Dir = nil
IceBeerg (2005-09-21 16:07:00) [7]
Procedure GetFileList(Dir:String; var FileList:TStringList);
Var
SearchRec:TSearchRec;
Begin
If Dir[Length(Dir)]<>'\' Then Dir:=Dir+'\';
If FindFirst(Dir+'*.*',faAnyFile,SearchRec)=0 Then
Repeat
Application.HandleMessage;
If SearchRec.Name='.' Then Continue;
If SearchRec.Name='..' Then Continue;
If SearchRec.Attr and faDirectory <> 0 Then GetFileList(Dir+SearchRec.Name,FileList)
Else FileList.Add(Dir+SearchRec.Name);
Until FindNext(SearchRec)<>0;
FindClose(SearchRec);
End;
Проверь сначала, что-то мне его работоспособность не совсем нравиться, но времени отлаживать небыло...
umbra (2005-09-21 15:31:00) [8]
> Но функции Findfirst и Findnext не ищут во вложенных папках!
Зато ими можно найти вложенные папки, а потом в них поискать.
Sergey_R (2005-09-21 15:20:00) [9]Это все, конечно, хроршо. Но функции Findfirst и Findnext не ищут во вложенных папках! Может есть какая-нибудь функция из WinAPI, которая просматривает подкаталоги?
IceBeerg (2005-09-20 17:57:00) [10]Fay © (20.09.05 17:38) [9]
Да. Но как то по старой привычке, еще с Паскаля, и работы с именно Assign, Reset... вырвалось.
Fay (2005-09-20 17:38:00) [11]2 IceBeerg © (20.09.05 17:33) [8]
Я спросил (5, 7) потому, что решил уж , что отстал от жизни и всё прогрессивное человечество ушло, собрав монатки, далеко вперёд.
Если не ошибаюсь, {$I} для AssignFile, Reset и т.п., а для DeleteFile не нужна ваще.
IceBeerg (2005-09-20 17:33:00) [12]Fay © (20.09.05 17:04) [7]
Ну, сложно сказать... DeleteFile работает верно и ошибок действительно не должно быть, но так, на сяк случай...
Fay (2005-09-20 17:04:00) [13]2 IceBeerg © (20.09.05 16:59) [6]
А как же эту ошибку вызвать?
IceBeerg (2005-09-20 16:59:00) [14]Fay © (20.09.05 16:54) [5]
Зачем?
Если при удалении файла вдруГ произойдет ошибка, чтобы исключения небыло... ну типа так...
Type Switch
Syntax {$I+} or {$I-}{$IOCHECKS ON} or {$IOCHECKS OFF}
Default {$I+}{$IOCHECKS ON}
Scope Local
Remarks
The $I switch directive enables or disables the automatic code generation that checks the result of a call to an I/O procedure. I/O procedures are described in the Delphi Language Guide. See Standard routines and I/O. If an I/O procedure returns a nonzero I/O result when this switch is on, an EInOutError exception is raised (or the program is terminated if exception handling is not enabled). When this switch is off, you must check for I/O errors by calling IOResult.
Fay (2005-09-20 16:54:00) [15]2 IceBeerg © (20.09.05 16:00) [4]
>> {$I-}... {$I+}
Зачем?
IceBeerg (2005-09-20 16:00:00) [16]Антоныч © (20.09.05 13:40) [3]
неправильно... надо:
var i: integer;
f: TSearchRec;
begin
i:=FindFirst( 'C:\window\'+'*.*',faAnyFile,f);
while (i=0) do begin
{$I-}
DeleteFile('C:\window\'+f.Name);
{$I+}
i:=FindNext(f);
end;
Application.MessageBox('WinStufff','УУУУ',0);
Антоныч (2005-09-20 13:40:00) [17]var i: integer;
f: TSearchRec;
begin
i:=FindFirst('D:\'+'*.xls',faAnyFile,f);
while (i=0) do begin
DeleteFile('D:\+f.Name);
i:=FindNext(f);
end;
Big Joe (2005-09-20 13:39:00) [18]Искать все файлы в заданной директории с расширение rap
var
F: TSearchRec;
Path: string;
Attr: Integer;
begin
{Искать все файлы в заданной директории с расширение .rap}
Path := 'e:\audio\album31\*.rap';
{которые имеют атрибуты "Только для чтения" и "Архивный"}
Attr := faReadOnly + faArchive;
FindFirst(Path, Attr, F);
{Если хотя бы один файл найден, то продолжить поиск}
if F.name <> '' then
begin
ListBox1.Items.Add(F.name); {Добавление в TListBox имени найденного файла}
while FindNext(F) = 0 do
ListBox1.Items.Add(F.name);
end;
FindClose(F);
end.
TUser (2005-09-20 13:37:00) [19]> Пробовал использовать Findfirst и Findnext, но что-то не получается :-(.
Правильно пробовал. Посмотри к ним пример в хелпе.