| 
| 
 | Вопрос # 1 311/ вопрос решён / | 
 |  Здравствуйте, эксперты!У меня к вам вот такой вопрос: как можно с помощью Делфи организовать копирование файла из одного места в другой?
 Заранее спасибо!
 
|  |   Вопрос задал: IlluminatI (статус: 2-ой класс)Вопрос отправлен: 3 февраля 2008, 21:50
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, IlluminatI!Смотрим в приложение. Там приведено два варинанта готовых функций.
 Также не забываем, что в файле Windows.pas, который по умолчанию подключается к юниту с формой уже обявленна функция вида
 
 function CopyFile(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL): BOOL; stdcall;Первые два параметра указывают откудова и куда копировать. Третий параметр указывает функции что делать, если файл уже существует (тоесть когда проводником копируем, выводит сообщения "файл существует, перезаписать?") если указать false - файл будет перетираться.
 true - функция просто не осуществит копирование. и возвратит false.
 Так как первые два параметра имеют тип PChar, то на первых порах это может немного "мешать". но ничево, всё нормально, просто если у нас переменная s типа string, то в качестве параметра просто пишем PChar(s). нужное приведение типов будет сделано автоматом.
 Тоесть можно сделать вот такую обёртку для неё
 
 function MyCopyFile(source, dest:string; bFailIfExists:boolean):boolean;
begin
  result := CopyFile(PChar(source), PChar(dest), bFailIfExists);
end; Приложение:Переключить в обычный режим   procedure FileCopy(const SourceFileName, TargetFileName: string);var  S, T : TFileStream;begin  S := TFileStream.Create(sourcefilename, fmOpenRead );  try    T := TFileStream.Create(targetfilename, fmOpenWrite or fmCreate);    try      T.CopyFrom(S, S.Size ) ;      FileSetDate(T.Handle, FileGetDate(S.Handle));    finally      T.Free;    end;  finally    S.Free;  end;end;   uses   ShellApi; function WindowsCopyFile(FromFile, ToDir : string) : boolean;var  F: TShFileOpStruct;begin  F.Wnd := 0; F.wFunc := FO_COPY;  FromFile:=FromFile+#0; F.pFrom:=pchar(FromFile);  ToDir:=ToDir+#0; F.pTo:=pchar(ToDir);  F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;  result:=ShFileOperation(F) = 0;end;  procedure TForm1.Button1Click(Sender: TObject);begin  if not WindowsCopyFile('C:UTILARJ.EXE', GetCurrentDir) then    ShowMessage('Copy Failed');end;  
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 4 февраля 2008, 00:36
 Оценка за ответ: 5
 |  Ответ #2. Отвечает эксперт: Feniks Здравствуйте, IlluminatI!В дополнении.
 Есть еще старый, добрый, дедовский методом Pascal.
 Приложение:Переключить в обычный режим Type  procedure FastFileCopy(Const InfileName, OutFileName: String; CallBack: TCallBack); TypePBuffer = ^TBuffer;TBuffer = array [1..BufSize] of Byte;varSize             : integer;Buffer           : PBuffer;infile, outfile  : File;SizeDone,SizeFile: Longint;beginif (InFileName <> OutFileName) thenbegin  buffer := Nil;  AssignFile(infile, InFileName);  System.Reset(infile, 1);  try    SizeFile := FileSize(infile);    AssignFile(outfile, OutFileName);    System.Rewrite(outfile, 1);    try      SizeDone := 0; New(Buffer);      repeat        BlockRead(infile, Buffer^, BufSize, Size);        Inc(SizeDone, Size);        CallBack(SizeDone, SizeFile);        BlockWrite(outfile,Buffer^, Size)      until Size < BufSize;      FileSetDate(TFileRec(outfile).Handle,        FileGetDate(TFileRec(infile).Handle));    finally     if Buffer <> Nil then Dispose(Buffer);     System.close(outfile)    end;  finally    System.close(infile);  end;end elseRaise EInOutError.Create('File cannot be copied into itself');end;
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 4 февраля 2008, 13:36
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 0. 31 января 2011, 19:30: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |