Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 223

/ вопрос открыт /

Здравствуйте!
Появилась необходимость скопировать папку с файлами и подпапками.
Нашел в сети нужный код http://programmersforum.ru/showthread.php?s=333af0a5e685c26e7dde7a18266dc952&t=27831
но он по неизвестной причине не копирует подпапки, только файлы.
Помогите пожалуйста разобраться как подправить этот код чтобы он был полностью работоспособен (копировал не только файлы). Или может у кого-нибудь есть ссылочка на рабочий код.

Приложение:
  1.  
  2. Delphi 2009
  3.  
  4.  
  5.  
  6. function FullDirectoryCopy(SourceDir, TargetDir: string; StopIfNotAllCopied,
  7. OverWriteFiles: Boolean): Boolean;
  8. var
  9. SR: TSearchRec;
  10. I: Integer;
  11. begin
  12. Result := False;
  13. SourceDir := IncludeTrailingBackslash(SourceDir);
  14. TargetDir := IncludeTrailingBackslash(TargetDir);
  15. if not DirectoryExists(SourceDir) then
  16. Exit;
  17. if not ForceDirectories(TargetDir) then
  18. Exit;
  19.  
  20. I := FindFirst(SourceDir + '*', faAnyFile, SR);
  21. try
  22. while I = 0 do
  23. begin
  24. if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
  25. begin
  26. if SR.Attr = faDirectory then
  27. Result := FullDirectoryCopy(SourceDir + SR.Name, TargetDir + SR.NAME,
  28. StopIfNotAllCopied, OverWriteFiles)
  29. else if not (not OverWriteFiles and FileExists(TargetDir + SR.Name))
  30. then
  31. Result := CopyFile(Pchar(SourceDir + SR.Name), Pchar(TargetDir +
  32. SR.Name), False)
  33. else
  34. Result := True;
  35. if not Result and StopIfNotAllCopied then
  36. exit;
  37. end;
  38. I := FindNext(SR);
  39. end;
  40. finally
  41. SysUtils.FindClose(SR);
  42. end;
  43. end;


Сергей П. Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Сергей П. (статус: Посетитель)
Вопрос отправлен: 22 декабря 2008, 11:30
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 22 декабря 2008, 13:02; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 22 декабря 2008, 11:52 [#1]:

Странно, код больно похож на рабочий. Он вообще не копирует вложенные папки или как то избранно?
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 22 декабря 2008, 12:16 [#2]:

Вообще папки не копирует, только файлы
Сергей П.

Сергей П. (статус: Посетитель), 22 декабря 2008, 12:16 [#3]:

Ну в смысле вложенные папки не копирут
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 22 декабря 2008, 12:43 [#4]:

Попробуйте заменить IncludeTrailingBackslash
на IncludeTrailingPathDelimiter
Вадим К

Вадим К (статус: Академик), 22 декабря 2008, 12:44 [#5]:

Судя с строк
if SR.Attr = faDirectory then
Result := FullDirectoryCopy(SourceDir + SR.Name, TargetDir + SR.NAME,
StopIfNotAllCopied, OverWriteFiles)
должен. Функцию не переименовывали?
Хотя там есть ещё одно подозрительное место
if not Result and StopIfNotAllCopied then
exit;
.
Попробуйте поэксперементировать на тестовом "наборе каталогов" с нейтральными именами (типа 1 2 3..). Если тоже не будет работать, будем копать глубже
Галочка "подтверждения прочтения" - вселенское зло.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 22 декабря 2008, 12:48 [#6]:

Вообще-то код рабочий - проверил. Копирует все и папки и файлы.
Запускал FullDirectoryCopy(edit1.Text,edit2.Text,false,true);
Сергей П.

Сергей П. (статус: Посетитель), 22 декабря 2008, 12:52 [#7]:

Все разобрался, видать аттрибуты файла по другому как-то закодированы (может из-за Висты).
Вобщем в строке if SR.Attr = faDirectory then
заменил на if SR.Attr = 8208 then
и все заработало.
Вадим К

Вадим К (статус: Академик), 22 декабря 2008, 12:59 [#8]:

я тут малось подумал...
код сравнения SR.Attr = faDirectory - это не совсем верно. Это будет правильно только если каталог не скрытый, не имеет никаких других атрибутов. более корректное сравнение такое
if faDirectory in SR.Attr then
или
if (SR.Attr and faDirectory) = faDirectory then
Я не помню точно по памяти, а делфи на работе нет. Но вроде второй вариант более правдоподобный.
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 22 декабря 2008, 13:02 [#9]:

Так и оказалось.
if (SR.Attr and faDirectory) = faDirectory then -работает !
спасибо еще раз.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:50
Выполнено за 0.02 сек.