В статье рассматривается, как скопировать, переименовать или переместить каталог со всеми вложениями. Создание, удаление и проверка существует папка или нет, рассмотрена в предыдущей статье.
Готовой функции для копирования папки, как для копирования файлов, нет. Поэтому здесь используются собственные пользовательские функции. Один из наиболее удобных методов, использует библиотеку 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));
Функция ExtractFilePath в Delphi, описание и примеры
Функция RemoveDir в Delphi, описание и примеры
Функция RenameFile в Delphi, описание и примеры
Александр Ящинский
- 17 октября 2021, 11:32 ↓Функции MoveFile и RenameFile не помогли. Сработало только через ShelAPI.
Спасибо за помощь!
Антон Сенников
- 06 сентября 2021, 12:03 ↓Согласен. Разумно перед применением подобной функции делать проверку на вводимые значения — наличие данных, а в идеале и валидацию.
Eclipse
- 06 сентября 2021, 10:39 ↓if MoveFile('', '') then результат будет 'Папка успешно перемещена.', а должен быть 'Ошибка при перемещении папки.'