Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 311

/ вопрос решён /

Здравствуйте, эксперты!
У меня к вам вот такой вопрос: как можно с помощью Делфи организовать копирование файла из одного места в другой?
Заранее спасибо!

IlluminatI Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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;

Приложение:
  1.  
  2.  
  3. procedure FileCopy(const SourceFileName, TargetFileName: string);
  4. var
  5. S, T : TFileStream;
  6. begin
  7. S := TFileStream.Create(sourcefilename, fmOpenRead );
  8. try
  9. T := TFileStream.Create(targetfilename, fmOpenWrite or fmCreate);
  10. try
  11. T.CopyFrom(S, S.Size ) ;
  12. FileSetDate(T.Handle, FileGetDate(S.Handle));
  13. finally
  14. T.Free;
  15. end;
  16. finally
  17. S.Free;
  18. end;
  19. end;
  20.  
  21.  
  22.  
  23. uses
  24.  
  25. ShellApi;
  26.  
  27. function WindowsCopyFile(FromFile, ToDir : string) : boolean;
  28. var
  29. F: TShFileOpStruct;
  30. begin
  31. F.Wnd := 0; F.wFunc := FO_COPY;
  32. FromFile:=FromFile+#0; F.pFrom:=pchar(FromFile);
  33. ToDir:=ToDir+#0; F.pTo:=pchar(ToDir);
  34. F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
  35. result:=ShFileOperation(F) = 0;
  36. end;
  37.  
  38.  
  39. procedure TForm1.Button1Click(Sender: TObject);
  40. begin
  41. if not WindowsCopyFile('C:UTILARJ.EXE', GetCurrentDir) then
  42. ShowMessage('Copy Failed');
  43. end;
  44.  
  45.  


Ответ отправил: Вадим К (статус: Академик)
Время отправки: 4 февраля 2008, 00:36
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, IlluminatI!
В дополнении.
Есть еще старый, добрый, дедовский методом Pascal.

Приложение:
  1. Type
  2.  
  3.  
  4. procedure FastFileCopy(Const InfileName, OutFileName: String; CallBack: TCallBack);
  5.  
  6. Type
  7. PBuffer = ^TBuffer;
  8. TBuffer = array [1..BufSize] of Byte;
  9. var
  10. Size : integer;
  11. Buffer : PBuffer;
  12. infile, outfile : File;
  13. SizeDone,SizeFile: Longint;
  14. begin
  15. if (InFileName <> OutFileName) then
  16. begin
  17. buffer := Nil;
  18. AssignFile(infile, InFileName);
  19. System.Reset(infile, 1);
  20. try
  21. SizeFile := FileSize(infile);
  22. AssignFile(outfile, OutFileName);
  23. System.Rewrite(outfile, 1);
  24. try
  25. SizeDone := 0; New(Buffer);
  26. repeat
  27. BlockRead(infile, Buffer^, BufSize, Size);
  28. Inc(SizeDone, Size);
  29. CallBack(SizeDone, SizeFile);
  30. BlockWrite(outfile,Buffer^, Size)
  31. until Size < BufSize;
  32. FileSetDate(TFileRec(outfile).Handle,
  33. FileGetDate(TFileRec(infile).Handle));
  34. finally
  35. if Buffer <> Nil then Dispose(Buffer);
  36. System.close(outfile)
  37. end;
  38. finally
  39. System.close(infile);
  40. end;
  41. end else
  42. Raise EInOutError.Create('File cannot be copied into itself');
  43. end;


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 4 февраля 2008, 13:36
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 19:30: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 21 октября 2017, 11:38
Выполнено за 0.28 сек.
Рейтинг@Mail.ru