|
Вопрос # 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);
-
- Type
- PBuffer = ^TBuffer;
- TBuffer = array [1..BufSize] of Byte;
- var
- Size : integer;
- Buffer : PBuffer;
- infile, outfile : File;
- SizeDone,SizeFile: Longint;
- begin
- if (InFileName <> OutFileName) then
- begin
- 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 else
- Raise EInOutError.Create('File cannot be copied into itself');
- end;
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 4 февраля 2008, 13:36
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 0.
31 января 2011, 19:30: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|