unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
LZExpand, ShellAPI, StdCtrls;
type
TCopyMethod = (cmMemBlock, cmMemStream, cmFileStream,
cmLZCopy, cmAPICopy, cmSHCopy);
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
FCopyMethod: TCopyMethod;
FHandle: THandle;
// ÆÄÀÏÀÇ Áߺ¹°Ë»ç
function OverWriteTgt(src,tgt: string): boolean;
begin
Result := True;
if FileExists(tgt) then
begin
if MessageDlg('ÆÄÀÏ ('+tgt+') ´Â ÀÌ¹Ì Á¸ÀçÇÕ´Ï´Ù !!'#13#10+
'±×·¡µµ º¹»çÇÒ±î¿ä ?',
mtConfirmation,[mbYes,mbNo],0) = mrYes then
Result := True
else
Result := False;
end;
end;
// ÆÄÀÏÀÇ Á¸Àç¿©ºÎ °Ë»ç
function CheckSrcF(st: string): boolean;
begin
Result := True;
if not FileExists(st) then
begin
MessageDlg('º¹»çÇÒ ÆÄÀÏÀÌ ¾ø½À´Ï´Ù ('+st+') !!', mtError, [mbOK], 0);
Result := False;
end;
end;
// API¸¦ ÀÌ¿ëÇÑ º¹»ç
function fcAPICopy(srcfname,tgtfname: string): boolean;
begin
result :=false;
if not CheckSrcF(srcfname) then exit;
if not OverWriteTgt(srcfname,tgtfname) then
exit
else
result :=CopyFile(PChar(srcfname),PChar(tgtfname),false);
end;
// Shell File OperationÀ» ÀÌ¿ëÇÑ º¹»ç
function fcSHCopy(srcfname,tgtfname: string): boolean;
var
inf: TSHFileOpStruct;
begin
Result := False;
if not CheckSrcF(srcfname) then
System.Exit;
srcfname := srcfname+#0#0;
tgtfname := tgtfname+#0#0;
inf.wnd := FHandle;
inf.wFunc := FO_COPY;
inf.pFrom := PChar(srcfname);
inf.pTo := PChar(tgtfname);
inf.fFlags := 0 or FOF_MULTIDESTFILES;
if SHFileOperation(inf) = 0 then
Result := True
else
Result := False;
end;
// Memory StreamÀ» ÀÌ¿ëÇÑ º¹»ç
function fcMemStream(srcfname,tgtfname: string): boolean;
var
srcf,tgtf: TMemoryStream;
begin
Result := False;
if not CheckSrcF(srcfname) then
System.Exit;
if not OverWriteTgt(srcfname, tgtfname) then
System.Exit;
result := True;
srcf := TMemoryStream.Create;
tgtf := TMemoryStream.Create;
try
srcf.LoadFromFile(srcfname);
tgtf.SaveToFile(tgtfname);
finally
srcf.Free;
tgtf.Free;
end;
end;
// File StreamÀ» ÀÌ¿ëÇÑ º¹»ç
function fcFStream(srcfname,tgtfname: string): boolean;
var
s, t: TFileStream;
begin
Result := False;
if not CheckSrcF(srcfname) then
System.Exit;
if not OverWriteTgt(srcfname,tgtfname) then
System.Exit;
Result := True;
s := TFileStream.Create(srcfname, fmOpenRead);
try
t := TFileStream.Create(tgtfname,fmOpenWrite or fmCreate );
try
t.CopyFrom(s, s.Size);
finally
t.Free;
end;
finally
s.Free;
end;
end;
// Block´ÜÀ§ÀÇ º¹»ç
function fcMemBlock(srcfname,tgtfname: string): boolean;
var
srcf,tgtf: file;
NumR,NumW: integer;
buff: array[1..2048] of char;
begin
Result := False;
if not CheckSrcF(srcfname) then
System.Exit;
if not OverWriteTgt(srcfname,tgtfname) then
System.Exit;
Result := True;
AssignFile(srcf, srcfname);
Reset(srcf, 1); {Open file, Record size = 1}
AssignFile(tgtf, tgtfname);
Rewrite(tgtf, 1); {Create file, Record size = 1}
repeat
BlockRead(srcf, buff, SizeOf(buff), NumR);
BlockWrite(tgtf, buff, NumR, NumW);
until (NumR = 0) or (NumW <> NumR);
CloseFile(srcf);
CloseFile(tgtf);
end;
// LZExpand¸¦ ÀÌ¿ëÇÑ º¹»ç
function fcLZCopy(srcfname,tgtfname: string): boolean;
var
srcf,tgtf: file;
begin
Result := False;
if not CheckSrcF(srcfname) then
System.Exit;
if not OverWriteTgt(srcfname,tgtfname) then
System.Exit;
Result := True;
AssignFile(srcf, srcfname);
AssignFile(tgtf, tgtfname);
Reset(srcf); {Open file}
try
Rewrite(tgtf); {Create file}
try
if LZCopy(TFileRec(srcf).Handle,TFileRec(tgtf).Handle) < 0 then
Result := False;
finally
CloseFile(tgtf);
end;
finally
CloseFile(srcf);
end;
end;
// À§ÀÇ 6°¡Áö º¹»çÇÔ¼ö¸¦ È£ÃâÇÏ´Â ·çƾ
function DoCopy(srcf,tgtf: string; cpm: TCopyMethod): boolean;
begin
case cpm of
cmMemStream : result := fcMemStream(srcf, tgtf);
cmMemBlock : result := fcMemBlock(srcf, tgtf);
cmLZCopy : result := fcLZCopy(srcf, tgtf);
cmFileStream : result := fcFStream(srcf, tgtf);
cmAPICopy : result := fcAPICopy(srcf, tgtf);
cmSHCopy : result := fcSHCopy(srcf, tgtf);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// »ç¿ë¿¹
if DoCopy('c:tempsmail.txt', 'c:zzzsmail.txt', cmSHCopy) then
ShowMessage('º¹»ç ¼º°ø')
else
ShowMessage('º¹»ç ½ÇÆÐ');
end;
end.
|
|