Space Base Space Base
+7 928 008-80-89
ru
  • en
  • es
  • Главная
  • Услуги
  • Портфолио
  • Библиотека
  • Контакты
  • Главная
  • Услуги
  • Портфолио
  • Библиотека
  • Контакты
  1. Библиотека
  2. Delphi
  3. Копирование, перемещение и переименование папки в Delphi
logo

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

07.01.2015

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

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

Готовой функции для копирования папки, как для копирования файлов, нет. Поэтому здесь используются собственные пользовательские функции. Один из наиболее удобных методов, использует библиотеку 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));

Другие материалы:

Закрытие формы нажатием Escape в Delphi


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


Функция ForceDirectories в Delphi, описание и примеры


Написать комментарий

Комментарии

В комментариях запрещено публиковать рекламные материалы. Все сообщения оправляются на модерацию и будут опубликованы, если не нарушают правил сайта после проверки.


коммент.

avatar

Александр Ящинский

- 17 октября 2021, 11:32 ↓
RAD Studio 11
Функции MoveFile и RenameFile не помогли. Сработало только через ShelAPI.
Спасибо за помощь!
avatar

Антон Сенников

- 06 сентября 2021, 12:03 ↓
Добрый день, Eclipse.
Согласен. Разумно перед применением подобной функции делать проверку на вводимые значения — наличие данных, а в идеале и валидацию.
avatar

Eclipse

- 06 сентября 2021, 10:39 ↓
Функция копирования каталога немного некорректна, т.к. если не указать пути копирования
if MoveFile('', '') then результат будет 'Папка успешно перемещена.', а должен быть 'Ошибка при перемещении папки.'

Разработка сайтов

Корпоративный сайт
Интернет-магазин
Лендинг - одностраничный сайт
Сайт-визитка
Сайт-портфолио

Проектирование

Прототип, UX-дизайн

Дизайн

UI-дизайн
Логотип

+54 911 2801-4950

info@space-base.net
+7 928 008-80-89

Web-сайты для успешного бизнеса

Web-сайты для успешного бизнеса

Главная Услуги Портфолио События Библиотека Контакты
+7 928 008-80-89 Меню
Политика в отношении обработки персональных данных © Copyright 2014 - | Space-Base

Лучшее время начать свой проект - Сейчас!

Выбраны опции:

Отправить сообщение на:

Telegram WhatsApp

Отправляя сообщение, вы даете свое согласие на
обработку песональных данных