Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
ВнизКак по всему диску C: удалить файлы с расширением *.tmp ??? Найти похожие ветки
← →
rolex (2003-11-07 22:16) [0]Как по всему диску C:\ удалить файлы с расширением *.tmp ???
← →
Anatoly Podgoretsky (2003-11-07 22:31) [1]ShFileOperation
← →
rolex (2003-11-07 22:40) [2]А можно полный пример??? Пожалуйста!
← →
Prof (2003-11-08 12:15) [3]Удалено модератором
← →
Anatoly Podgoretsky (2003-11-08 13:32) [4]Приметы есть в Чаво, в нем есть поиск, будут конкретные вопросы приходи, я бы лично не рискнул давать пример, помню что было в разных конференциях после этого, так что бери сам готовые и доводи.
← →
RoLeX (2003-11-08 17:57) [5]Вот, я тут нашёл:
var
F: TSearchRec;
Path: string;
Attr: Integer;
begin
{Искать все файлы в заданной директории с расширение .wav}
Path := "C:\*.tmp";
{которые имеют атрибуты "Только для чтения" и "Архивный"}
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.
Только как сделать, чтобы он искал по всему диску C:\, a не в корне диска C:\ ???
← →
Anatoly Podgoretsky (2003-11-08 18:26) [6]Рекурсивно вызывать для папок
← →
panov (2003-11-08 18:26) [7]Так заглянул в FAQ или нет? Там есть пример.
← →
RoLeX (2003-11-08 18:28) [8]
> panov © (08.11.03 18:26) [7]
> Так заглянул в FAQ или нет? Там есть пример.
Заходил, похоже плохо искал.
To ALL:
function DelDir(dir: string): Boolean;
var fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do begin
wFunc := FO_DELETE;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
pFrom := PChar(dir + #0);
end;
Result := (0 = ShFileOperation(fos));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DelDir("C:\XXX\*.tmp");
end;
Вот сделал, тока как сделать, чтобы включая вложенные папки удалял???
← →
sniknik (2003-11-08 18:30) [9]> Вот, я тут нашёл:
не надо искать. попробуй сам, это совсем несложно, только чуть подумать.
> Только как сделать, чтобы он искал по всему диску C:\, a не в корне диска C:\ ???
надо сделать рекурсию с входом в каждую поддиректорию ... и т.д.
← →
Anatoly Podgoretsky (2003-11-08 18:34) [10]Эта функция удаляет и папки, если конечно такие будут соотвествовать маске
← →
Anatoly Podgoretsky (2003-11-08 18:35) [11]sniknik © (08.11.03 18:30) [9]
Не требуется, это вроде рекурсивная функция
← →
Anatoly Podgoretsky (2003-11-08 18:40) [12]Что бы не было сомнения, проверил с компиляцией, прекрасно удаляет в соответствии с маской.
← →
RoLeX (2003-11-08 18:41) [13]
> sniknik © (08.11.03 18:30) [9]
> > Вот, я тут нашёл:
> не надо искать. попробуй сам, это совсем несложно, только
> чуть подумать.
>
> > Только как сделать, чтобы он искал по всему диску C:\,
> a не в корне диска C:\ ???
> надо сделать рекурсию с входом в каждую поддиректорию ...
> и т.д.
Несложно? Я думаю ко мне, к начинающему, это не относится.
Чё такое рекурсия и как её сделать???
← →
RoLeX (2003-11-08 18:42) [14]
> Anatoly Podgoretsky © (08.11.03 18:40) [12]
> Что бы не было сомнения, проверил с компиляцией, прекрасно
> удаляет в соответствии с маской.
У меня тоже всё прекрасно удаляет, но во вложенных папках - нет.
← →
RoLeX (2003-11-08 18:45) [15]Эх! Как в *.Bat файле хорошо:
del "%HOMEDRIVE%\*.tmp" /q/s > NUL
del "D:\*.tmp" /q/s > NUL
Ну так кто-нибудь поможет или нет???
← →
Anatoly Podgoretsky (2003-11-08 18:48) [16]RoLeX © (08.11.03 18:42) [14]
Я еще раз подчеркиваю включая вложенные папки, для примера в проверке я использовал глубину в три уровня. Все удалили как миленькая и не пикнула.
← →
Anatoly Podgoretsky (2003-11-08 18:50) [17]Единственное изменение, которое было сделано в примере, это вот это DelDir("C:\XXX\*.tmp"); заменено на DelDir("C:\Temp\*.tmp"); мне лень было создавать папку ХХХ, к меня к ней идиокризия.
← →
RoLeX (2003-11-08 18:54) [18]
> Anatoly Podgoretsky © (08.11.03 18:50) [17]
> Единственное изменение, которое было сделано в примере,
> это вот это DelDir("C:\XXX\*.tmp"); заменено на DelDir("C:\Temp\*.tmp");
> мне лень было создавать папку ХХХ, к меня к ней идиокризия.
И чё во вложенных папках тоже удалялись файлы с расширением *.tmp ???
← →
Anatoly Podgoretsky (2003-11-08 18:56) [19]Надо ли еще раз повторять, удалялось все что соответствовало маске.
← →
Palladin (2003-11-08 18:58) [20]Жуть какая.
Рекурсия в данном случае это вызов процедуры самой себя. Попробуй в голове нарисовать эту схему исполнения. И допиши DelDir как надо. Или создай внешнюю процедуру для поиска по структуре диска и вызовом DelDir.
← →
Anatoly Podgoretsky (2003-11-08 19:07) [21]В местном чаво есть и другие примеры, более подходящие.
← →
RoLeX (2003-11-08 19:35) [22]Ну всё-таки! Напишите мне код, котороый удаляет по всему диску C:\ файлы с раширением *.tmp. Поторяю, по всему(!) , включая вложенные папки.
У меня сил не хватает, такое сделать, т.к. я начинающий.
Напишите код, пожалуйста.
← →
RoLeX (2003-11-08 20:09) [23]Вот ещё нашёл:
procedure removeTree(DirName: string);
var
FileSearch: SearchRec;
begin
{ для начала пробегаемся, и удаляем все файлы }
chDir(DirName);
FindFirst("*.*", Directory, FileSearch);
while (DosError = 0) do
begin
if (FileSearch.name <> ".") and (FileSearch.name <> "..") and
((FileSearch.attr and Directory) <> 0) then
begin
if DirName[length(DirName)] = "\" then
removeTree(DirName + FileSearch.Name)
else
removeTree(DirName + "\" + FileSearch.Name);
ChDir(DirName);
end;
FindNext(FileSearch)
end; end;
Скажите это то или не то???
И там дочерта ошибок, исправьте их плиз, и напишите полностью рабочий код!!! ОЧень прошу!
← →
panov (2003-11-08 20:51) [24]Вот уж над исправлением ошибок не мешает самому потрудиться.
А вот найденый в FAQ пример:
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988622376&n=15
← →
RoLeX (2003-11-08 21:13) [25]
> Вот уж над исправлением ошибок не мешает самому потрудиться.
> А вот найденый в FAQ пример:
> http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988622376&n=15
Насчёт ошибок: самому потрудиться не получиться, т.к. я новичок, и абсолютно плохо знаю Delphi.
А насчёт FAQ:
function DeleteDir(Dir : string) : boolean;Var Found : integer; SearchRec : TSearchRec;begin result:=false; if IOResult<>0 then ; ChDir(Dir); if IOResult<>0 then begin ShowMessage("Не могу войти в каталог: "+Dir); exit; end; Found := FindFirst("*.*", faAnyFile, SearchRec); while Found = 0 do begin if (SearchRec.Name<>".")and(SearchRec.Name<>"..") then if (SearchRec.Attr and faDirectory)<>0 then begin if not DeleteDir(SearchRec.Name) then exit; end else if not DeleteFile(SearchRec.Name) then begin ShowMessage("Не могу удалить файл: "+SearchRec.Name); exit; end; Found := FindNext(SearchRec); end; FindClose(SearchRec); ChDir(".."); RmDir(Dir); result:=IOResult=0;end;
Это код, который ты мне предложил, но мне его пришлось немного подкорректировать:
УдалилRmDir(Dir);
, т.к. мне каталог не надо удалять.
ИсправилFound := FindFirst("*.*", faAnyFile, SearchRec);
наFound := FindFirst("*.tmp", faAnyFile, SearchRec);
, т.к. удалять мне все файлы не надо, а только с расширением *.tmp
И в итоге:удаляются файлы с расширением *.tmp, но во вложенных папках не удаляются! А если не заменятьFound := FindFirst("*.*", faAnyFile, SearchRec);
наFound := FindFirst("*.tmp", faAnyFile, SearchRec);
, то удаляются все файлы, зато во вложенных дирректориях тоже.
КОроче я ничего не пойму что творится! Кто-нибудь мне поможет??!!
← →
sniknik (2003-11-08 21:47) [26]Anatoly Podgoretsky © (08.11.03 18:35) [11]
это я писал не видя RoLeX © (08.11.03 18:28) [8] а на предыдушее. и вроде не везде будет работать (по хелпу "Now Supported on Windows NT", а если не "Now" а версия постарее, а если не NT?).
RoLeX © (08.11.03 18:41) [13]
RoLeX © (08.11.03 21:13) [25]
пример с рекурсией (написано только что ;о)), только потому что и сам вроде чтото делаеш, ищеш... удалять не стал (мне свои файлы жалко :о)) только поиск. (ведь просто?)
procedure TForm1.Button1Click(Sender: TObject);
procedure SearchTmp(StDir: string);
var sr: TSearchRec;
begin
if StDir[Length(StDir)] <> "\" then StDir:= StDir + "\";
if FindFirst(StDir+"*.tmp", faReadOnly + faArchive, sr) = 0 then begin
repeat
ListBox1.Items.Add(StDir+sr.name);
Application.ProcessMessages;
until FindNext(sr) <> 0;
end;
FindClose(sr);
if FindFirst(StDir+"*.*", faDirectory, sr) = 0 then begin
repeat
if sr.Name[1] <> "." then SearchTmp(StDir+sr.name); // <- рекурсия!
until FindNext(sr) <> 0;
end;
FindClose(sr);
end;
begin
SearchTmp("c:\");
end;
← →
Maxud (2003-11-08 21:50) [27]procedure TForm1.Button1Click(Sender: TObject);
procedure ViewFldr(Fldr: string);
var sr: TSearchRec;
begin
if FindFirst(Fldr+"\*.*",faAnyFile, sr) = 0 then
repeat
if sr.Name[1] <> "." then
begin
ListBox1.Items.Add(fldr+"\"+sr.Name);
if (sr.Attr and faDirectory)=faDirectory then
ViewFldr(fldr+"\"+sr.Name);
end;
until findnext(sr)<>0;
findclose(sr);
end;
begin
ListBox1.Clear;
ViewFldr("c:");
end;
← →
Palladin (2003-11-08 21:51) [28]
> Maxud © (08.11.03 21:50) [27]
Ну а если имя файла ".filename"?
← →
Maxud (2003-11-08 21:52) [29]
> sniknik © (08.11.03 21:47) [26]
sorry, опоздал-с :)
← →
Maxud (2003-11-08 21:59) [30]Наскоро делал...
вместоsr.Name[1] <> "."
можно
сделать(sr.Name <> ".")and(sr.Name<>"..")
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.01 c