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

Вниз

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

 
sers   (2002-11-21 17:12) [0]

Добрый день.

Мне необходимо удалить все файлы по заданной маске (*.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);

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

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

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


 
KoluChi ©   (2002-11-21 17:21) [1]

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


 
KoluChi ©   (2002-11-21 17:23) [2]

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


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

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

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

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


 
KoluChi ©   (2002-11-21 17:46) [4]

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


 
KoluChi ©   (2002-11-21 17:50) [5]

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


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

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


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

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

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


 
KoluChi ©   (2002-11-21 17:59) [8]

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;


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

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.


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

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


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

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


 
Song ©   (2002-11-21 21:09) [12]

format c: /q


 
Separator ©   (2002-11-22 08:22) [13]

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


 
KoluChi ©   (2002-11-22 10:45) [14]

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


 
Song ©   (2002-11-22 10:48) [15]

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


 
F1 ©   (2002-11-22 10:52) [16]

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


 
Separator ©   (2002-11-22 10:53) [17]

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


 
KoluChi ©   (2002-11-22 11:00) [18]

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


 
Anatoly Podgoretsky ©   (2002-11-22 11:05) [19]

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

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



Страницы: 1 вся ветка

Текущий архив: 2002.12.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
1-4461
F1
2002-11-20 13:48
2002.12.02
Эксперимент с TreeView


1-4302
MaXie
2002-11-21 12:20
2002.12.02
Excel и Delphi!


14-4575
copyr25
2002-11-06 18:41
2002.12.02
---|Ветка была без названия|---


1-4507
Anatoly P
2002-11-20 07:54
2002.12.02
ToolButton Canvas?


1-4301
SiaCD
2002-11-19 19:47
2002.12.02
Дата создания файла...как поменять?