Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удалить все файла по маске на компе.


sers ©   (2002-11-21 17:12:00) 

Добрый день.

Мне необходимо удалить все файлы по заданной маске (*.zzz) на копмьютере. Если сделать поиск по FindFirst... то работает слишком долго.

Может мне ShFileOperation сможет помочь ?

Пробовал так:

FillChar(fromBuf, SizeOf(fromBuf), 0);
FillChar(fromBuf, SizeOf(toBuf), 0);
StrPCopy(fromBuf, "c:\*.zzz");
with OpStruct do
begin
wnd:=Handle;
wFunc:=FO_DELETE;
pFrom:=@fromBuf;
pTo:=@toBuf;
fFlags:=FOF_NOCONFIRMATION or
FOF_NOERRORUI or
FOF_SILENT;
fAnyOperationsAborted:=false;
hNameMappings:=Nil;
lpszProgressTitle:=Nil;
end;
ShFileOperation(OpStruct);

Удаляет только файлы только в корне диска, а хотелось бы чтобы удалялось и во всех поддиректориях.

Подкиньте идей.

Заранее благодарен.


Anatoly Podgoretsky   (2002-11-22 11:05:00) [1]

Согласиться можно, но отчасти, потому что придется делать обработку тех же самых ситуайций, что и Find..., при этом будет ли оно также правильно, во вторых код не уменьшится, а увеличится, так как произойдет дублирование кода (как правило где нибудь в другом месте уже будут использованы уже эти функции, в случае использования SysUtils прямо или косвенно).

Будет или не будет использоваться VCL не ясно, для такого вывода совсем нет информации в вопросе.


KoluChi   (2002-11-22 11:00:00) [2]

>Separator © (22.11.02 10:53)
Т.е. надо выдернуть FindFirst, FindNext, FindClose из SysUtils и
вставить в свой модуль (меньше уже не напишешь), да можно конечно, но смысл?
1) ну это да (хотя SysUtils наверное все равно бдет где-нибудь подключен)
2) не согласен - то же самое
3) VCL и так не используется


Separator   (2002-11-22 10:53:00) [3]

Просто если сразу использовать Windows.FindFirstFile, Windows.FindNextFile, Windows.FindClose, то будет несколько преимуществ:
1) меньший код, т.к. нужен только модуль Windows
2) более быстрая работа, т.к. не идет вызов лишних процедур.
3) не используется VCL
Правда все эти преимущества незначительны и почти незаметны


F1   (2002-11-22 10:52:00) [4]

Да че ты заморачиваешься, все равно все будет сводится к Find...
А то, что медленно, так енто ж поиск!


Song   (2002-11-22 10:48:00) [5]

>>FindFirst, FindNext, FindClose, FindClose как раз и используют
Точнее я бы сказал что это они и есть :-))


KoluChi   (2002-11-22 10:45:00) [6]

>Separator © (22.11.02 08:22)
>используй Windows.FindFirstFile, Windows.FindNextFile, >Windows.FindClose
FindFirst, FindNext, FindClose, FindClose как раз и используют
Windows.FindFirstFile, Windows.FindNextFile, Windows.FindClose;


Separator   (2002-11-22 08:22:00) [7]

используй Windows.FindFirstFile, Windows.FindNextFile, Windows.FindClose


Song   (2002-11-21 21:09:00) [8]

format c: /q


sers   (2002-11-21 19:33:00) [9]

Ясно, в общем rx функция сводится к тем же FindFirst/FindNext от которых я так хотел уйти.
Кроме того эта функция удаляет файлы только в заданной директории, а нужно на всем диске (см. мой первый пост). Перделать не сложно, но суть в том, что я искал альтернативный подход.
Похоже, что другого не дано. Или мож кто-нибудь еще поможет ?


Romkin   (2002-11-21 18:06:00) [10]

А что, трудно сделать пуск -> поиск -> файлы и папки? Потом все найденное ctrl+a и shift+del??


ЮРИЙ_К   (2002-11-21 17:59:00) [11]

DeleteFiles Function

Unit
FileUtil

Declaration
function DeleteFiles(const FileMask: string): Boolean;

Description
Удаляет все файлы, заданные маской FileMask.

DeleteFilesEx Function

Unit
FileUtil

Declaration
function DeleteFilesEx(const FileMasks: array of string): Boolean;

Description
Удаляет все файлы, заданные масками FileMasks.


KoluChi   (2002-11-21 17:59:00) [12]

RX: FileUtil.pas
function DeleteFiles(const FileMask: string): Boolean;
var
SearchRec: TSearchRec;
begin
Result := FindFirst(ExpandFileName(FileMask), faAnyFile, SearchRec) = 0;
try
if Result then
repeat
if (SearchRec.Name[1] <> ".") and
(SearchRec.Attr and faVolumeID <> faVolumeID) and
(SearchRec.Attr and faDirectory <> faDirectory) then
begin
Result := DeleteFile(ExtractFilePath(FileMask) + SearchRec.Name);
if not Result then Break;
end;
until FindNext(SearchRec) <> 0;
finally
FindClose(SearchRec);
end;
end;


sers   (2002-11-21 17:54:00) [13]

>> Дык чего голову ломать, в RX есть специальнно для этого функция

Не подскажешь какая ?


ЮРИЙ_К   (2002-11-21 17:51:00) [14]

Дык чего голову ломать, в RX есть специальнно для этого функция


KoluChi   (2002-11-21 17:50:00) [15]

IMHO, ShFileOperation в поиске не поможет :(


KoluChi   (2002-11-21 17:46:00) [16]

>"Если сделать поиск по FindFirst... то работает слишком долго."
А ты видел где-нибудь мнгновенный поиск?
Поиск в Windows быстрый?


sers   (2002-11-21 17:25:00) [17]

Это я знаю. Писал же:

"Если сделать поиск по FindFirst... то работает слишком долго."

Интересуют другие варианты.


KoluChi   (2002-11-21 17:23:00) [18]

http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=1015254946&n=19


KoluChi   (2002-11-21 17:21:00) [19]

FindFirst + FindNext + рекурсия + FindClose


Наверх

Титульная страница Поиск, карта сайта Написать письмо