|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Осуществить копирование файлов без замены существующих через функцию 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)); Последний раз редактировалось Maxjuvefan, 18.12.2016 в 17:53. |
#2
|
||||
|
||||
Все-равно функция CopyF лишь оболочка и копирует по одному файлу, хотя SHFileOperation умеет копировать сразу несколько файлов, то перед копированием можно проверять существование файла через GetFileAttributes, к примеру. В случае наличия не копировать. Функция увеличится на 1 строчку кода.
Пишу программы за еду. __________________ |
#3
|
||||
|
||||
Или тогда нужна связка из флага FOF_WANTMAPPINGHANDLE и hNameMappings, в структурах SHNAMEMAPPING которой содержаться все имена копируемых файлов - на этом этапе можно проверить на совпадение имён и отменить копирование
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#4
|
|||
|
|||
А как применить GetFileAttributes?
|
#5
|
||||
|
||||
Код:
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; Пишу программы за еду. __________________ |