![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удалить все файла по маске на компе.
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