Копирование каталога из одного места в другое.



Два года тому назад я задумался на переносом папок из одного компьютера в в другие компьютеры. Учтите, не файлов, а папок, содержащих файлов. Просто из интереса и еще помочь университете, в котором я когда-то учился...

Один знакомый дал исходный код переноса папок с файлами, но наотрез отказался опубликоваться, предоставляя мне самому делать...
Правда, код немного недоработан, но при желании можно устранить недостаток кода.

Основная часть

Сейчас будем кодить в среде Lazarus, похожая на Delphi.

Создай форму и оформи форму как на рис.1

Самое интересное впереди. Обратите внимание на невизульный компонент SelectDirectoryDialog1. Он играет роль OpenDialog, но только вместо файлов выбираете каталоги. Есть ли такой компонент в Delphi, я не знаю.

Сейчас напишем функцию, которая отвечает за копирование каталогов из одного места в другое.

function CopyDirectory( StrFrom, StrTo : string) : Boolean;
var
  F : TShFileOpStruct;
begin
  F.wFunc:=FO_COPY;
  F.pFrom:=PChar(StrFrom + #0);
  F.pTo:=PChar(StrTo+#0);
  F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
  if ShFileOperation(F) = 0 then
    result:=False
  else
    result:=True;
end

Мы рассмотрим подробнее эту функцию.
function CopyDirectory( StrFrom, StrTo : string) : Boolean;
Здесь мы объявлем функцию под названием CopyDirectory, которая будет проверяться булевой алгеброй, то есть в случае успешного копирования будет True и наоборот, False.
StrFrom, StrTo -- переменные, которые мы будем брать для копирования каталогов.

var
  F : TShFileOpStruct;

Присваиваемся переменнонй F значение TShFileOpStruct, которое вы найдете в документации, достаточно выделив это слово и нажав F1.

Весь остальной код смотри в исходниках...

Теперь откомпилируем программу, нажав кнопку F9.

Заключение

Правда, она работает как-то странно.
Программа сначала считывает выбранные для копирования в другое место каталоги с файлами, предварительно организовав промежуточные папки в папке с проектом Lazarus.
Уж я не знаю, как с ним. Нахожусь в поиске решения этого недостатка

Written by: Zanuda25

ВложениеРазмер
Source.zip281.34 КБ

Комментарии

2 комментария(ев)
аватар: VGoudkov
VGoudkov
Дата: ПТ, 09/04/2010 - 20:09
Звание: Наблюдатель
Сообщений: 1

Идея хороша, но...
Во первых, бывают UNICODE пути.
Во вторых, периодически случаются проблемы со слишком длинными путями, когда насоздавать вложенных папок можно, а скопировать - нельзя.
В третьих - в случае копирования большого количества мелких файлов - было бы интереснее выделять большой буфер, сначала всё читать из одного места, а потом писать в другое...

аватар: DimaBy
DimaBy
Дата: ПТ, 16/04/2010 - 15:44
Звание: Наблюдатель
Сообщений: 3

Цитировать


Программа сначала считывает выбранные для копирования в другое место каталоги с файлами, предварительно организовав промежуточные папки в папке с проектом Lazarus.

А вы попробуйте установить текущую папку в StrTo.
В TShFileOpStruct, кстати, есть флаг, который позволяет отображать прогресс копирования.