| Цитата(Dynamic @ 2.8.2004, 06:51) | | Давай свой код. |
полностью рабочая процедура, но так как это для синхронизатора файлов, то предполагается две таблицы.Переменая i инициализируется вне функции(т.е. i:=0). В ее составлении мне помогли FAQ Vit'a и Guest(та часть, где идет рекурсивный поиск файлов)
| Код | //функция сканирования и отбора файлов Procedure ScanDir(Dir,Dir2:String;Grid:TStringGrid); var DateDos:Integer;{в переменную записывается дата последнего изменения файла} begin{Начало процедуры}{1} {Если имя каталога существует и не равно '' или'\', тогда добавляем к имени каталога '\', чтобы войти в его корень} if Dir<>'' then if Dir[length(Dir)]<>'\' then Dir:=Dir+'\'; if Dir2<>'' then if Dir2[length(Dir2)]<>'\' then Dir2:=Dir2+'\'; {если в корне этого каталога есть к-либо файл, тогда...} if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then BEGIN{...} repeat{выполняем следующую операцию}{2} {если имя любого найденного файла содержит только'.' или '..' -то проходим дальше, ничего не совершая, к следующим файлам, если такие есть} if (SearchRec.name='.') or (SearchRec.name='..') then continue; {если атрибуты этих файлов "Директория" тогда...} if (SearchRec.Attr and faDirectory)<>0 then begin{3} ScanDir(Dir+SearchRec.Name,Dir2+SearchRec.Name,Grid); {мы нашли директорию: "Dir+SearchRec.name", которую будем сканировать рекурсивным вызовом функции ScanDir} end {3}{if (SearchRec.Attr and faDirectory)<>0 then} else {Если атрибуты этих файлов не "Директория, тогда...} Showmessage('Мы нашли файл '+Dir+SearchRec.name); //мы нашли файл: "Dir+SearchRec.name" i:=i+1; {Если такой же файл существует в противоположной папке, тогда...} ShowMessage('проверяю наличие файла в папке '+ Dir2+SearchRec.Name); if FileExists(Dir2+SearchRec.Name)=True then BEGIN{4} ShowMessage('Файл '+ Dir+SearchRec.name+' в папке '+Dir2+SearchRec.Name+' есть'); {Находим и записываем данные этого файла в промежуточную файловую переменную NF} FindFirst(Dir2+SearchRec.Name,faAnyFile, NF); {и определяем время последнего изменения этого файла в формате DOS} DateDos:=NF.Time; FindClose(NF); {Производим сравнение двух дат: файла с именем SearchRec.Name с найденным выше файлом} //Если дата файла с именем SearchRec.Name БОЛЬШЕ даты найденнго файла, значит он НОВЕЙ // и его добавляем в таблицу if SearchRec.Time>DateDos then BEGIN{5} ShowMessage('Добавляю Файл '+ Dir+SearchRec.name+' в папку '+Dir2+SearchRec.Name); //количество строк в таблице прибавляем с каждым добавляемым файлом Grid.RowCount:=Grid.RowCount+1; {Записываем в таблицу атрибуты файла} Grid.Cells[0,i]:=SearchRec.Name; Grid.Cells[1,i]:=(DateToStr(FileDateToDateTime(SearchRec.Time))+ ' '+TimeToStr(FileDateToDateTime(SearchRec.Time))); Grid.Cells[2,i]:=IntToStr(SearchRec.Size); Grid.Cells[3,i]:=ExtractFileDir(Dir+SearchRec.Name); Grid.Cells[4,i]:=Dir2; END;{5} END{4} {Если совпадений файлов нет, то их тоже добавляем в таблицу} else begin{6} ShowMessage('Файла '+ Dir+SearchRec.name+' в папке '+Dir2+SearchRec.Name+' нет'); ShowMessage('Добавляю Файл '+ Dir+SearchRec.name+' в папку '+Dir2+SearchRec.Name); //количество строк в таблице прибавляем с каждым добавляемым файлом Grid.RowCount:=Grid.RowCount+1; Grid.Cells[0,i]:=SearchRec.Name; Grid.Cells[1,i]:=(DateToStr(FileDateToDateTime(SearchRec.Time))+ ' '+TimeToStr(FileDateToDateTime(SearchRec.Time))); Grid.Cells[2,i]:=IntToStr(SearchRec.Size); //путь каталога-источника Grid.Cells[3,i]:=ExtractFilePath(Dir+SearchRec.Name); //путь каталога-назначения Grid.Cells[4,i]:=Dir2; end;{6} until FindNext(SearchRec)<>0; END{...}; FindClose(SearchRec); Grid.RowCount:=Grid.RowCount-1; end;{1}
| |