![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте. Программа осуществляет копирование всех файлов и папок из одной указанной директории в другую. Копирование осуществляется посредством функции 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; |