Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Копирование директорий и удаление директорий в корзину

Delphi , Файловая система , Корзина

Копирование директорий и удаление директорий в корзину

Автор: Xavier Pacheco

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TMainForm = class(TForm)
    GroupBox1: TGroupBox;
    spbtnGetFromDir: TSpeedButton;
    spbtnGetToDir: TSpeedButton;
    edtFromDir: TEdit;
    edtToDir: TEdit;
    Button1: TButton;
    GroupBox2: TGroupBox;
    edtRecycleDir: TEdit;
    spbtnRecycleBin: TSpeedButton;
    btnRecycleDir: TButton;
    btnClose: TButton;
    procedure spbtnGetFromDirClick(Sender: TObject);
    procedure spbtnGetToDirClick(Sender: TObject);
    procedure btnCopyDirectoryClick(Sender: TObject);
    procedure spbtnRecycleBinClick(Sender: TObject);
    procedure btnRecycleDirClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation
uses ShellAPI, FileCtrl;
{$R *.DFM}

function GetDirectory: string;
begin
  if not SelectDirectory(Result, [sdAllowCreate, sdPerformCreate, sdPrompt], 0)
    then
    Result := EmptyStr;
end;

procedure CopyDirectoryTree(AHandle: THandle; const AFromDirectory,
  AToDirectory: string);
var
  SHFileOpStruct: TSHFileOpStruct;
  FromDir: PChar;
  ToDir: PChar;
begin

  GetMem(FromDir, Length(AFromDirectory) + 2);
  try
    GetMem(ToDir, Length(AToDirectory) + 2);
    try

      FillChar(FromDir^, Length(AFromDirectory) + 2, 0);
      FillChar(ToDir^, Length(AToDirectory) + 2, 0);

      StrCopy(FromDir, PChar(AFromDirectory));
      StrCopy(ToDir, PChar(AToDirectory));

      with SHFileOpStruct do
      begin
        Wnd := AHandle; // Assign the window handle
        wFunc := FO_COPY; // Specify a file copy
        pFrom := FromDir;
        pTo := ToDir;
        fFlags := FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
        fAnyOperationsAborted := False;
        hNameMappings := nil;
        lpszProgressTitle := nil;
        if SHFileOperation(SHFileOpStruct) <> 0 then
          RaiseLastWin32Error;
      end;
    finally
      FreeMem(ToDir, Length(AToDirectory) + 2);
    end;
  finally
    FreeMem(FromDir, Length(AFromDirectory) + 2);
  end;
end;

procedure ToRecycle(AHandle: THandle; const ADirName: string);
var
  SHFileOpStruct: TSHFileOpStruct;
  DirName: PChar;
  BufferSize: Cardinal;
begin
  BufferSize := Length(ADirName) + 1 + 1;
  GetMem(DirName, BufferSize);
  try
    FillChar(DirName^, BufferSize, 0);
    StrCopy(DirName, PChar(ADirName));

    with SHFileOpStruct do
    begin
      Wnd := AHandle;
      wFunc := FO_DELETE;
      pFrom := DirName;
      pTo := nil;
      fFlags := FOF_ALLOWUNDO;

      fAnyOperationsAborted := False;
      hNameMappings := nil;
      lpszProgressTitle := nil;
    end;

    if SHFileOperation(SHFileOpStruct) <> 0 then
      RaiseLastWin32Error;
  finally
    FreeMem(DirName, BufferSize);
  end;
end;

procedure TMainForm.spbtnGetFromDirClick(Sender: TObject);
begin
  edtFromDir.Text := GetDirectory;
end;

procedure TMainForm.spbtnGetToDirClick(Sender: TObject);
begin
  edtToDir.Text := GetDirectory;
end;

procedure TMainForm.btnCopyDirectoryClick(Sender: TObject);
begin
  CopyDirectoryTree(Handle, edtFromDir.Text, edtToDir.Text);
end;

procedure TMainForm.spbtnRecycleBinClick(Sender: TObject);
begin
  edtRecycleDir.Text := GetDirectory;
end;

procedure TMainForm.btnRecycleDirClick(Sender: TObject);
begin
  ToRecycle(0, edtRecycleDir.Text);
end;

procedure TMainForm.btnCloseClick(Sender: TObject);
begin
  Close;
end;

end.

Программа на Delphi - графическое пользовательское интерфейсе (GUI) приложение, позволяющее пользователям копировать директории и перемещать файлы в корзину. Вот обзор того, что каждый часть кода делает:

Основная форма Основная форма (TMainForm) содержит несколько компонентов:

  • GroupBox1 и GroupBox2: эти групповые ящики содержат другие управляющие элементы.
  • edtFromDir, edtToDir и edtRecycleDir: эти редактируемые контролы, где пользователи могут ввести пути директорий.
  • spbtnGetFromDir, spbtnGetToDir и spbtnRecycleBin: эти кнопки скорости запускают выбор путей директорий с помощью функции Windows SelectDirectory.
  • Button1 (Copy Directory) и btnRecycleDir: эти кнопки выполняют операции копирования и удаления, соответственно.
  • btnClose: это кнопка для закрытия приложения.

Функция GetDirectory Функция GetDirectory использует функцию Windows SelectDirectory, чтобы позволить пользователям выбрать путь директории. Если пользователь отменяет выбор, возвращается пустая строка.

Процедура CopyDirectoryTree Процедура CopyDirectoryTree рекурсивно копирует дерево директорий источника в дерево директорий назначения с помощью функции Shell API SHFileOperation.

Процедура ToRecycle Процедура ToRecycle использует функцию Shell API SHFileOperation, чтобы переместить файлы из указанной директории в корзину.

События кнопок Каждый событийный обработчик кнопки (например, spbtnGetFromDirClick, btnCopyDirectoryClick) отвечает за выполнение конкретных действий:

  • spbtnGetFromDirClick: заполняет редактируемый контроль edtFromDir выбранной директории.
  • spbtnGetToDirClick: заполняет редактируемый контроль edtToDir выбранной директории.
  • btnCopyDirectoryClick: запускает операцию копирования с помощью процедуры CopyDirectoryTree.
  • spbtnRecycleBinClick: заполняет редактируемый контроль edtRecycleDir выбранной директории.
  • btnRecycleDirClick: запускает операцию удаления с помощью процедуры ToRecycle.
  • btnCloseClick: закрывает приложение.

Исполнение Код использует различные единицы, включая ShellAPI и FileCtrl, для взаимодействия с оболочкой Windows и файловой системой. Исполнение простое, каждый процедура или функция выполняет конкретную задачу.

Альтернативные решения Чтобы улучшить этот код, можно рассмотреть следующие альтернативы:

  • Вместо использования SHFileOperation для копирования и удаления файлов использовать встроенные функции Delphi TFileCopy и TFileDelete.
  • Реализовать обработку ошибок, чтобы обрабатывать потенциальные исключения и ошибки при операциях с файлами.
  • Рассмотреть добавление дополнительных функций, таких как:
    • Фильтрация файлов (например, копировать только конкретные типы файлов).
    • Полоса прогресса или статус-индикатор для долгоживущих операций.
    • Поддержка нескольких директорий копирования или удаления.

Копирование директорий и удаление директорий в корзину реализовано с помощью интерфейса Windows API, позволяя пользователю копировать директорию из одной папки в другую или отправлять директорию в корзину.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Корзина ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-27 02:03:20/0.0033879280090332/0