Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > FindFirst, FindNext,FindClose


Автор: Slawanix 31.7.2004, 03:30
Хочу дописать давно заброшенный синхронизатор файлов, но пока не могу добиться, чтобы с FindFirst, FindNext,FindClose найти файлы не только в прописанной папке, но и во вложенных в нее каталогах.


biggrin.gif Как могею так и юзаю

Автор: December 31.7.2004, 05:15
Тема не менее 5 раз поднималась... Только в этом разделе...

Автор: Guest 31.7.2004, 07:55
Вот пример рекурсивного удаления каталога. Отсюда и копай....
Код

Procedure deldir(dir : String; mask : string);
Var
Found  : integer;
SearchRec : TSearchRec;
f,fdir:textfile;
begin
 If length(dir)<4 then exit;
 If dir[length(dir)]<>'\' then dir:=dir+'\';
 Found := FindFirst(dir+'*.*', faAnyFile, SearchRec);
 while Found = 0 do
 begin
  if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then
  begin
 If fileexists(dir+SearchRec.Name) and extinmask(mask,getext(dir+SearchRec.Name)) then begin
 try
 Filesetattr(dir+SearchRec.Name,0);
 Assignfile(f,dir+SearchRec.Name);
 {$I-}
 erase(f);
 {$I+}
 except;
 end;
 end else If directoryexists(dir+SearchRec.Name) then deldir(dir+SearchRec.Name, mask);
  end;
   Found := sysutils.FindNext(SearchRec);
 end;
 FindClose(SearchRec);
 try
removedir(dir);
 except
 end;
end;

Автор: Slawanix 1.8.2004, 01:52
Цитата(December @ 31.7.2004, 05:15)
Тема не менее 5 раз поднималась... Только в этом разделе...

Прошу прощения за невнимательность, и спасибо за подсказку.

Кто ищет, тот всегда... ищет adv/51.gif adv/51.gif
Добавлено @ 01:55
Цитата(Guest @ 31.7.2004, 07:55)
Вот пример рекурсивного удаления каталога. Отсюда и копай....

Спасибо огроменное незарегестрированному парню, хотелось бы высказать благодарность лично, но за неимением и не могением.... adv/49.gif

Автор: Vit 1.8.2004, 02:34
Вообще-то эта тема в FAQ есть

Автор: Slawanix 1.8.2004, 18:43
Цитата(Vit @ 1.8.2004, 02:34)
Вообще-то эта тема в FAQ есть

Vit, спасибо, что снизошел с Чикагских небес и высот профи. Уже качаю! adv/iwashere.gif

Чем больше я узнаю, тем больше понимаю, что очень мало знаю notify.gif

Автор: Slawanix 1.8.2004, 18:56
Цитата(Guest @ 31.7.2004, 07:55)
Вот пример рекурсивного удаления каталога. Отсюда и копай....
Код

Procedure deldir(dir : String; mask : string);

Не совсем понимаю в коде назначение mask:string.
И еще компилятор ругается на extinmask и getext
Код
begin
 if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then
 begin
If fileexists(dir+SearchRec.Name) and extinmask(mask,getext(dir+SearchRec.Name)) then begin
(говорит: необъявленные переменные); Может быть какой-то модуль надо дополнительно подключить, хотя я видел подобное in SysUtils.pas.


Ка-а-а-а-ки-и-м ты-ы-ы бы-ы-ы-ыллл...... adv/idontnow.gif

Автор: Illusion Dolphin 1.8.2004, 23:03
Slawanix :
Этот гвест был я. Да, это дополнительные функции, просто к сути идеи они были не важны, но если надо, то даю:

Код

Function getext(Filename : string) : string;
var
 i,j:integer;
 s:string;
begin
j:=0;
For i:=length(filename) downto 1 do
begin
 If filename[i]='.' then
 begin
  j:=i;
  break;
 end;
 If filename[i]='\' then break;
end;
s:='';
If j<>0 then
begin
 s:=copy(filename,j+1,length(filename)-j);
 For i:=1 to length(s) do
 s[i]:=Upcase(s[i]);
end;
result:=s;
end;


function extinmask(mask : string; ext : string):boolean;
var i,j:integer;
begin
result:=false;
If mask='||' then
begin
 result:=true;
 exit;
end;
for i:=1 to length(mask) do
begin
 if mask[i]='|' then
 for j:=i to length(mask) do
 begin
  If mask[j]='|' then
  If (j-i-1>0) and (i+1<length(mask)) then
  if (upcaseall(copy(mask,i+1,j-i-1))<>'') and (upcaseall(copy(mask,i+1,j-i-1))=upcaseall(ext)) then
  begin
   result:=true;
   Break;
  end;
 end;
 If Result then Break;
end;
end;


маска - маска для удаления файлов. Если она равна '||', то удаляется всё, что можно, если, например, '|EXE|DLL|' - то экзэшники и библиотеки. Писал функции давно чисто для интереса.

Автор: Slawanix 2.8.2004, 02:24
Спасибо всем, кто отклинулся на эту тему, или, быть может хотел сделать это, Вы мне помогли.Как камень..... с души! inlove.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)