СтатьиПрограммирование в Delphi

Копирование, перемещение и переименование папки в Delphi

В статье рассматривается, как скопировать, переименовать или переместить каталог со всеми вложениями. Создание, удаление и проверка существует папка или нет, рассмотрена в предыдущей статье.

Копирование папки

Готовой функции для копирования папки, как для копирования файлов, нет. Поэтому здесь используются собственные пользовательские функции. Один из наиболее удобных методов, использует библиотеку ShellApi.

// Функция копирования каталога
function CopyDir(const fromDir, toDir: string) : Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do begin
wFunc := FO_COPY;
fFlags := FOF_ALLOWUNDO;
pFrom := PChar(fromDir + #0);
pTo := PChar(toDir)
end;
Result := (0 = ShFileOperation(fos));
end;

// Вызов функции копирования из текста программы
if CopyDir('c:\myfolder', 'c:\new\myfolder') then
ShowMessage('Папка успешно скопирована.')
else
ShowMessage('Ошибка при копировании папки.');

В разделе описаний необходимо добавить библиотеку:

uses
ShellApi;

При успешном выполнении копирования, функция вернет значение True, если были ошибки и копирование выполнено не корректно, вернет False.

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

fFlags := FOF_ALLOWUNDO + FOF_NOCONFIRMATION;

Этот флаг запрещает выводы запросов пользователю.

Однако, если будут встречаться уже существующие файлы, они не будут заменяться. Чтобы исправить это, добавляем еще флаг:

fFlags := FOF_ALLOWUNDO + FOF_NOCONFIRMATION + FOF_MULTIDESTFILES;

Еще флаги:

FOF_ALLOWUNDO – если есть возможность, удаление производится в корзину.

FOF_SILENT – запрещает показывать стандартное окно операционной системы с прогрессом копирования.

FOF_RENAMEONCOLLISION – если файл уже существует, копируется с добавлением «Копия» в имя файла или папки.

Переименование и перемещение папок

Для перемещения каталогов можно использовать функцию MoveFile или RenameFile.

Возможности этих функций сходны. Для каждой указывается абсолютный или относительный путь к исходному каталогу, и новому, куда планируется перемещение. Если перемещение выполнено успешно, функции возвращают значение True, если нет, False.

if MoveFile('c:\myfolder', 'c:\new\myfolder') then
ShowMessage('Папка успешно перемещена.')
else
ShowMessage('Ошибка при перемещении папки.');

if RenameFile('c:\myfolder', 'c:\new\myfolder') then
ShowMessage('Папка успешно перемещена.')
else
ShowMessage('Ошибка при перемещении папки.');

Если же нужно просто переименовать папку, то новое имя папки указывается без изменения директории:

MoveFile('c:\myfolder', 'c:\newfolder');

RenameFile('c:\myfolder', 'c:\newfolder');

Отличие есть, если задавать директории строковой переменной или строковым свойством компонента (например, свойством Text, компонента Edit). Функция RenameFile, будет работать с простым указанием путей из компонентов:

RenameFile(EditFrom.Text, EditTo.Text);

Для функции MoveFile, при указании параметров необходимо выполнить приведение типов:

MoveFile(PChar(EditFrom.Text), PChar(EditTo.Text));


Комментарии

Имя:
Текст комментария:
* В комментариях запрещено публиковать рекламные объявления. Сообщения, содержащие ссылки на сторонние ресурсы добавляется в скрытом режиме. Они будут открыты, если не нарушают установленных правил, после проверки.
Защита от спам-роботов (* Обязателельно укажите ответ на простой вопрос ниже.)
Под каким номером в алфавите буква «Б»? (цифра)