Unit Unit1;
{$mode objfpc}{$H+}
Interface
Uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
Type
{ TForm1 }
TCopyFileProgress = Procedure(ASize, ATotalBytesRead: Longint) Of Object;
TForm1 = Class(TForm)
Button1: TButton;
Memo1: TMemo;
Procedure Button1Click(Sender: TObject);
Procedure CopyFileProgress(ASize, ATotalBytesRead: Longint);
Private
{ private declarations }
Public
{ public declarations }
End;
Var
Form1: TForm1;
Implementation
Uses
LazFileUtils;
{$R *.lfm}
{ TForm1 }
Function CopyFile(Const SrcFilename, DestFilename: String; FOnCopyFileProgress: TCopyFileProgress;
Flags: TCopyFileFlags = [cffOverwriteFile];
ExceptionOnError: Boolean = False): Boolean;
Var
SrcHandle: THandle;
DestHandle: THandle;
Buffer: Array[1..4096] Of Byte;
ReadCount, WriteCount, TryCount: Longint;
TotalRead, FileSize : LongInt;
Begin
Result := False;
// check overwrite
If (Not (cffOverwriteFile In Flags)) And LazFileUtils.FileExistsUTF8(DestFileName) Then
exit;
// check directory
If (cffCreateDestDirectory In Flags) And
(Not LazFileUtils.DirectoryExistsUTF8(ExtractFilePath(DestFileName))) And
(Not LazFileUtils.ForceDirectoriesUTF8(ExtractFilePath(DestFileName))) Then
exit;
TryCount := 0;
While TryCount <> 3 Do
Begin
SrcHandle := LazFileUtils.FileOpenUTF8(SrcFilename, fmOpenRead Or fmShareDenyWrite);
If (THandle(SrcHandle) = feInvalidHandle) Then
Begin
Inc(TryCount);
Sleep(10);
End
Else
Begin
TryCount := 0;
Break;
End;
End;
If TryCount > 0 Then
If ExceptionOnError Then
Raise EFOpenError.CreateFmt({SFOpenError}'Unable to open file "%s"', [SrcFilename])
Else
exit;
Try
FileSize := LazFileUtils.FileSizeUtf8(SrcFilename);
TotalRead := 0;
DestHandle := LazFileUtils.FileCreateUTF8(DestFileName);
If (THandle(DestHandle) = feInvalidHandle) Then
If ExceptionOnError Then
Raise EFCreateError.CreateFmt({SFCreateError}'Unable to create file "%s"', [DestFileName])
Else
Exit;
Try
Repeat
ReadCount := FileRead(SrcHandle, Buffer[1], High(Buffer));
TotalRead := TotalRead + ReadCount;
If Assigned(FOnCopyFileProgress) Then
FOnCopyFileProgress(FileSize, TotalRead);
If ReadCount <= 0 Then
break;
WriteCount := FileWrite(DestHandle, Buffer[1], ReadCount);
If WriteCount < ReadCount Then
If ExceptionOnError Then
Raise EWriteError.CreateFmt({SFCreateError}'Unable to write to file "%s"',
[DestFileName])
Else
Exit;
Until False;
Finally
FileClose(DestHandle);
End;
If (cffPreserveTime In Flags) Then
LazFileUtils.FileSetDateUTF8(DestFilename, FileGetDate(SrcHandle));
Result := True;
Finally
FileClose(SrcHandle);
End;
End;
Procedure TForm1.Button1Click(Sender: TObject);
Var
newerror: Boolean;
Begin
newerror := False;
Button1.Enabled := False;
Cursor := crHandPoint;
Application.ProcessMessages;
Try
Try
Begin
copyfile('K:\Downloads\Unsorted\DraftSight64.exe', 'K:\Downloads\Unsorted\DraftSight642.exe',
@CopyFileProgress);
End;
Except
On E: Exception Do
Begin
newerror := True;
End;
End;
Finally;
Cursor := crDefault;
Button1.Enabled := True;
End;
End;
Procedure TForm1.CopyFileProgress(ASize, ATotalBytesRead: Longint);
Begin
Memo1.Lines.Add(Format('Read %d of %d', [ATotalBytesRead, ASize]));
End;
End.