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

Автоматизация сохранения файлов в Delphi: работа с "FileUpload" и уникальными именами

Delphi , Интернет и Сети , Браузер

При разработке приложений на Delphi часто возникает задача сохранения файлов, загруженных пользователем, с использованием компонента "FileUpload". Одной из распространенных проблем при этом является необходимость избежать перезаписи файлов с одинаковыми именами. В данной статье рассмотрим, как можно автоматизировать процесс сохранения файлов, используя уникальные имена для предотвращения потери данных.

Подход к решению

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

Исходный код и проблема

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

procedure TsomeForm.UniFileUpload1Completed(Sender: TObject; AStream: TFileStream);
var
  DestName : string;
  DestFolder : string;
begin
  DestFolder := UniServerModule.StartPath + 'files\' + UniMainModule.foldername + '\';
  DestName := DestFolder + UniMainModule.FirstName + '_' + UniMainModule.LastName + '.pdf';
  CopyFile(PChar(AStream.FileName), PChar(DestName), False);
  ModalResult := mrOk;
end;

Альтернативное решение

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

procedure TsomeForm.UniFileUpload1Completed(Sender: TObject; AStream: TFileStream);
var
  DestName, NewName : string;
  DestFolder : string;
  Cnt: integer;
begin
  DestFolder := UniServerModule.StartPath + 'files\' + UniMainModule.foldername + '\';
  DestName := DestFolder + UniMainModule.FirstName + '_' + UniMainModule.LastName + '.pdf';
  if FileExists(DestName) then begin
    Cnt := 0;
    repeat
      Inc(Cnt);
      NewName := Format(DestFolder + UniMainModule.FirstName + '_' + UniMainModule.LastName + '(%d).pdf', [Cnt]);
    until not FileExists(NewName);
    DestName := NewName;
  end;
  CopyFile(PChar(AStream.FileName), PChar(DestName), False);
  ModalResult := mrOk;
end;

Подтвержденный ответ: использование CopyFile с bFailIfExists

Более безопасный способ - использовать функцию CopyFile в цикле с параметром bFailIfExists установленным в True. Это позволит попробовать скопировать файл, и если произойдет ошибка ERROR_FILE_EXISTS, повторить попытку с уникальным именем.

procedure TsomeForm.UniFileUpload1Completed(Sender: TObject; AStream: TFileStream);
var
  DestName : string;
  DestFolder : string;
  n : integer;
begin
  DestFolder := UniServerModule.StartPath + 'files\' + UniMainModule.foldername + '\';
  DestName := UniMainModule.FirstName + '_' + UniMainModule.LastName + '.pdf';
  n := 0;
  while not CopyFile(PChar(AStream.FileName), PChar(DestFolder + DestName), True) do
  begin
    if GetLastError() <> ERROR_FILE_EXISTS then
      // Обработка ошибки
      Break;
    n := n + 1;
    DestName := UniMainModule.FirstName + '_' + UniMainModule.LastName + ' (' + IntToStr(n) + ').pdf';
  end;
  ModalResult := mrOk;
end;

Альтернативный подход: использование SHFileOperation

Для более надежного решения можно использовать функцию SHFileOperation с флагом FOF_RENAMEONCOLLISION, которая позволит операционной системе самостоятельно выбрать уникальное имя в случае конфликта.

uses
  ..., Winapi.ShellAPI;
...
procedure TsomeForm.UniFileUpload1Completed(Sender: TObject; AStream: TFileStream);
var
  DestName, DestFolder : string;
  fo : TSHFileOpStruct;
begin
  DestFolder := UniServerModule.StartPath + 'files\' + UniMainModule.foldername + '\';
  DestName := DestFolder + UniMainModule.FirstName + '_' + UniMainModule.LastName + '.pdf';
  ZeroMemory(@fo, SizeOf(fo));
  fo.Wnd := Handle;
  fo.wFunc := FO_COPY;
  fo.pFrom := PChar(AStream.FileName + #0);
  fo.pTo := PChar(DestName + #0);
  fo.fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOERRORUI or FOF_NOCONFIRMMKDIR or FOF_RENAMEONCOLLISION;
  if SHFileOperation(fo) <> 0 then
    // Обработка ошибки
  else if fo.fAnyOperationsAborted then
    // Обработка отмены операции
  ModalResult := mrOk;
end;

Заключение

Использование CopyFile с проверкой на существование файла или же применение SHFileOperation с флагом FOF_RENAMEONCOLLISION позволяет автоматизировать процесс сохранения файлов, предотвращая их перезапись и сохраняя уникальность имен. Выбор метода зависит от конкретных требований и предпочтений разработчика.

Создано по материалам из источника по ссылке.

Автоматизация сохранения файлов в Delphi с использованием компонента 'FileUpload' и создания уникальных имен для избежания перезаписи существующих файлов.


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

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




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


:: Главная :: Браузер ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:48:38/0.002140998840332/0