unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Button2: TButton; Button3: TButton; Memo1: TMemo; Edit1: TEdit; Label1: TLabel; Button4: TButton; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var Stream1, Stream2: TFileStream; begin if OpenDialog1.Execute and SaveDialog1.Execute then begin Stream1 := TFileStream.Create ( OpenDialog1.FileName, fmOpenRead); try Stream2 := TFileStream.Create ( SaveDialog1.FileName, fmOpenWrite or fmCreate); try Stream1.Position:=Stream1.Size-1024; Stream2.CopyFrom (Stream1, 1024); finally Stream2.Free; end; finally Stream1.Free; end; end; end; procedure TForm1.Button2Click(Sender: TObject); var s:TStream; begin s:=TFileStream.Create('C:\sample.txt',fmCreate or fmOpenWrite); s.Size:=1024*1024*1024; //1Gb; s.Free; end; //Main procedure. procedure TForm1.Button3Click(Sender: TObject); var Stream1, Stream2: TFileStream; //Stream1 - Src stream; Stream2 - Dest stream; buf:PChar; //Buffer for readed data pos,rlen:Integer; //pos - position for read in Stream1. rlen - length in bytes to read Stream1 bufsize:Integer; //size of buffer label m; //label for loop begin try if OpenDialog1.Execute and SaveDialog1.Execute then begin pos:=0; bufsize:=StrToInt(Edit1.Text)*1024*1024; // bufsize in KB. m: Stream1 := TFileStream.Create (OpenDialog1.FileName, fmOpenRead); //create input stream for read data try //create output stream for write readed data. WinAPI: CreateFile If not FileExists(SaveDialog1.FileName) then Stream2 := TFileStream.Create (SaveDialog1.FileName, fmOpenWrite or fmCreate) else Stream2 := TFileStream.Create (SaveDialog1.FileName, fmOpenWrite); try GetMem(Buf, bufsize); //-get memory for readed data if Stream1.Size-Stream2.Size>bufsize then rlen:=bufsize else rlen:=Stream1.Size-Stream2.Size; //read data to buffer and write it to file. WinAPI: ReadFile, WriteFile, SetFilePointer Stream1.Position:=pos; Stream1.ReadBuffer(buf^,rlen) ; Stream2.Position:=Stream2.Size; Stream2.Write(buf^,rlen) ; Memo1.Lines.Clear; Memo1.Lines.Add('Copied: '+IntToStr(Stream2.Size)) ; Memo1.Lines.Add('Count: '+IntToStr(Stream1.Size)) ; //free memory for buffer FreeMem(buf); If Stream2.Size=Stream1.Size then begin Memo1.Lines.Clear; Memo1.Lines.Add('Complete!') ; Memo1.Lines.Add('Please check cache of files!') ; exit; end; finally Stream2.Free;//WinAPI: CloseHandle end; finally Stream1.Free;//WinAPI: CloseHandle end; pos:=pos+bufsize; Application.ProcessMessages; goto m; end; except on e:Exception do Memo1.Text:='ERR: '+e.Message; end; end; procedure TForm1.Button4Click(Sender: TObject); begin ShowMessage('Author: Burshtyn Nikolay. Special for ReactOS project.'); end; end.