Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2012, 22:26   #1
biohazard120
Пользователь
 
Регистрация: 14.09.2012
Сообщений: 12
По умолчанию Рекурсивное копирование данных

Здравствуйте, уважаемые форумчане. Сегодня столкнулся с проблемой.
Собственно сабж: нашел в интернете кусок кода для рекурсивного копирования, но он копирует только половину данных(данный код уже приводился на этом форуме, однако вразумительного ответа никто не дал). После вырезания условия проверки SR.Attr = faDirectory (такое решение пришло после часового изучения функции дебаггером) копироваться стали все файлы, однако теперь функция в любом случае возвращает false. Прошу помощи у более опытных собратьев. =)

Код:
function TForm1.FDC(SourceDir, TargetDir: string; StopIfNotAllCopied,
  OverWriteFiles: Boolean): Boolean;
var
  SR: TSearchRec;
  I: Integer;
begin
  Result := False;
  SourceDir := IncludeTrailingBackslash(SourceDir);
  TargetDir := IncludeTrailingBackslash(TargetDir);
  if not DirectoryExists(SourceDir) then
    Exit;
  if not ForceDirectories(TargetDir) then
    Exit;
  I := FindFirst(SourceDir + '*', faAnyFile, SR);
  try
    while I = 0 do
    begin
      if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
      begin
        if SR.Attr = faDirectory then
          Result := FDC(SourceDir + SR.Name, TargetDir + SR.NAME,
            StopIfNotAllCopied, OverWriteFiles)
        else if not (not OverWriteFiles and FileExists(TargetDir + SR.Name)) then
            Result := CopyFile(Pchar(SourceDir + SR.Name), Pchar(TargetDir +
            SR.Name), False)
        else
          Result := True;
        if not Result and StopIfNotAllCopied then
          exit;
      end;
      I := FindNext(SR);
    end;
  finally
    SysUtils.FindClose(SR);
  end;
end;
P.S. Не ругаться на IncludeTrailingBackslash, он прекрасно работает в RAD 2010
biohazard120 вне форума Ответить с цитированием
Старый 31.10.2012, 23:36   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Папки кроме faDirectory могут иметь другие атрибутов(скрытые и т.п). Каталог/не каталог лучше различать так
Код:
if (SR.Attr and faDirectory) = faDirectory then каталог
if (SR.Attr and faDirectory) <> faDirectory then не каталог
При выходе по exit надо бы по этикету закрыть поиск.

P.S. Остальное не проверял
eoln вне форума Ответить с цитированием
Старый 31.10.2012, 23:46   #3
biohazard120
Пользователь
 
Регистрация: 14.09.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Папки кроме faDirectory могут иметь другие атрибутов(скрытые и т.п). Каталог/не каталог лучше различать так
Код:
if (SR.Attr and faDirectory) = faDirectory then каталог
if (SR.Attr and faDirectory) <> faDirectory then не каталог
При выходе по exit надо бы по этикету закрыть поиск.

P.S. Остальное не проверял
Благодарю, помогло. Тему можно закрыть
biohazard120 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение данных по определенному диапазону строк и при совпадении значений копирование данных в другой лист Volk358 Microsoft Office Excel 6 02.10.2012 09:54
Рекурсивное вычисление выражения *Firefly* Помощь студентам 4 16.02.2012 21:49
Рекурсивное вычисление определителя матрицы. Winterfox Помощь студентам 0 18.12.2011 18:03
Рекурсивное зацикливание Alex_Almaty Помощь студентам 8 06.07.2010 07:49