Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.12.2016, 17:39
Maxjuvefan Maxjuvefan вне форума
Прохожий
 
Регистрация: 24.08.2015
Сообщения: 30
Версия Delphi: delphi 2010
Репутация: 10
По умолчанию Осуществить копирование файлов без замены существующих через функцию SHFileOperation

Здравствуйте. Программа осуществляет копирование всех файлов и папок из одной указанной директории в другую. Копирование осуществляется посредством функции SHFileOperation:
Код:
function TMainForm.CopyF(fromDir, toDir: string): boolean;
var
   fos: TSHFileOpStruct;
   todir2: string;
begin
   todir2:=todir;
   ZeroMemory(@fos, SizeOf(fos));
   with fos do
   begin
      wFunc := FO_COPY;
      //fFlags := FOF_FILESONLY;
      fFlags:= FOF_SIMPLEPROGRESS;   //Показывать диалог с индикатором прогресса, но не показывать имен файлов
      fflags:= fflags or FOF_NOCONFIRMATION; //Отвечает "yes to all" на все запросы в ходе опеации
      fflags:= fflags or FOF_SILENT;  //Не показывать диалог с индикатором прогресса
      pFrom := PChar(fromDir + #0);
      pTo := PChar(toDir2);
   end;
   Result := (0 = ShFileOperation(fos));
end;
Пример использования
Код:
  CopyF(PChar (RootFolder.FromLabel.Caption), PChar (RootFolder.InLabel.Caption));
Если файл существует, то он будет заменен автоматически. Но мне этого не надо, так как копирование будет происходить автоматически через таймер, и массив файлов со временем будет увеличиваться. В папке, откуда надо копировать, каждый день будет создаваться папка с текущей датой, а в эту папку будут падать в течении суток файлы. Получается, что по истечению 10 дней программа будет перекопировать все папки с файлами за 10 дней, а это не нужно. Как сделать так, чтобы, если файлы уже существует, то копирование не происходило. Смотрел информацию по fFlags, но нужного не нашел, есть только FOF_RENAMEONCOLLISION - присваивает файлу новое имя при операциях копирования, перемещения или переименования, если файл с указанным именем уже существует, но мне нужно, чтобы он просто не копировался.

Последний раз редактировалось Maxjuvefan, 18.12.2016 в 17:53.
Ответить с цитированием
  #2  
Старый 18.12.2016, 17:49
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Все-равно функция CopyF лишь оболочка и копирует по одному файлу, хотя SHFileOperation умеет копировать сразу несколько файлов, то перед копированием можно проверять существование файла через GetFileAttributes, к примеру. В случае наличия не копировать. Функция увеличится на 1 строчку кода.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 18.12.2016, 17:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Или тогда нужна связка из флага FOF_WANTMAPPINGHANDLE и hNameMappings, в структурах SHNAMEMAPPING которой содержаться все имена копируемых файлов - на этом этапе можно проверить на совпадение имён и отменить копирование
Ответить с цитированием
  #4  
Старый 18.12.2016, 18:29
Maxjuvefan Maxjuvefan вне форума
Прохожий
 
Регистрация: 24.08.2015
Сообщения: 30
Версия Delphi: delphi 2010
Репутация: 10
По умолчанию

А как применить GetFileAttributes?
Ответить с цитированием
  #5  
Старый 19.12.2016, 18:07
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
uses
  ShellAPI;

function SHCopyFile(ExistingFileName: string; NewFileName: string): Boolean;
var
  FileOp: TSHFileOpStruct;
begin
  if GetFileAttributes(
    PChar(NewFileName+ExtractFileName(ExistingFileName))
  )=INVALID_FILE_ATTRIBUTES then
  begin
    ZeroMemory(@FileOp, SizeOf(TSHFileOpStruct));
    FileOp.wFunc:=FO_COPY;
    FileOp.pFrom:=PChar(ExistingFileName+#0);
    FileOp.pTo:=PChar(NewFileName+#0);
    FileOp.fFlags:=FOF_SILENT;
    Result:=SHFileOperation(FileOp)=0;
  end else Result:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  {
    Lines.Strings = (
      'd:\CommonFiles\src\1.txt'
      'd:\CommonFiles\src\2.txt'
      'd:\CommonFiles\src\3.txt'
      'd:\CommonFiles\src\4.txt')
  }
  while Memo1.Lines.Count>0 do
  begin
    if not SHCopyFile(Memo1.Lines[0], 'd:\CommonFiles\dst\') then RaiseLastOSError;
    Memo1.Lines.Delete(0);
  end;
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:27.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter