📄 tservercopythreadunit.~pas
字号:
unit TServerCopyThreadUnit;
interface
uses
Classes,SysUtils,IdTCPServer,ComCtrls,IdGlobal,StrUtils;
type
TServerCopyThread = class(TThread)
private
{ Private declarations }
TheSDirName:String;
TheTDirName:string;
TheOUser:String;
TheThread:TIdPeerThread;
protected
procedure RegisteLog;
procedure Execute; override;
public
constructor Create(AThread:TIdPeerThread;TheSDir,TheTDir,TheUser:String);
destructor Destroy; override;
end;
implementation
uses unit2;
var TotallSize:int64;
//获取指定目录下的所有文件名
procedure GetFileList(ThePath:String;TheList:TStrings);
Var
sr: TSearchRec;
begin
if FindFirst(ThePath+'*.*',faAnyFile, sr) = 0 then
begin
repeat
if (Sr.Attr<16) then
begin
TheList.Add(ThePath+Sr.Name);
TotallSize:=TotallSize+Sr.Size;
end;
if (Sr.Attr>=32) then
if (Sr.Attr<48) then
begin
TheList.Add(ThePath+Sr.Name);
TotallSize:=TotallSize+Sr.Size;
end;
if (Sr.Attr<32) and (Sr.Attr>=16) then
begin
if (Sr.Name<>'.') then
if (Sr.Name<>'..') then
GetfileList(ThePath+Sr.Name+'\',TheList);
end;
if (Sr.Attr>=48) then
begin
if (Sr.Name<>'.') then
if (Sr.Name<>'..') then
GetfileList(ThePath+Sr.Name+'\',TheList);
end;
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;
procedure TServerCopyThread.RegisteLog;
var
TheListItem:TListItem;
begin
if Form2.LogCheckBox.Checked=false then exit;
TheListItem:=Form2.ListView5.Items.Insert(0);
TheListItem.Caption:=TheThread.Connection.Binding.PeerIP;
TheListItem.StateIndex:=9;
TheListItem.SubItems.Add(TheOUser);
TheListItem.SubItems.Add('目录复制');
TheListItem.SubItems.Add('从目录'+TheSDirName+'到'+TheTDirName);
TheListItem.SubItems.Add(DateTimeToStr(now));
end;
constructor TServerCopyThread.Create(AThread:TIdPeerThread;TheSDir,TheTDir,TheUser:String);
begin
inherited Create(true);
TheSDirName:=TheSDir;
TheTDirName:=TheTDir;
TheOUser:=TheUser;
TheThread:=AThread;
self.Suspended:=false;
FreeOnTerminate :=True;
end;
procedure TServerCopyThread.Execute;
var
TheFileList:TStringList;
i:integer;
TargetFile,NewDir:string;
ReadEchoStr:String;
begin
self.Synchronize(RegisteLog);
TheFileList:=TStringList.Create;
TotallSize:=0;
GetFilelist(TheSDirName,TheFileList);
Try
TheThread.Connection.WriteInteger(TheFileList.Count);
TheThread.Connection.WriteInteger(TotallSize); //送会目录文件数目及总的大小
Except
TheFileList.Free;
TheThread.Connection.Disconnect;
self.Terminate;
end;
if TheSDirName[Length(TheSDirName)]='\' then
TheSDirName:=StrUtils.LeftStr(TheSDirName,Length(TheSDirName)-1);
NewDir:=ExtractFileName(TheSDirName); //分解出原目录子
TheSDirName:=ExtractFilePath(TheSDirName); //分解出原目录子根
//目录存在处理---------------------------1
if DirectoryExists(TheTDirName+NewDir+'\') then
begin
try
TheThread.Connection.Write('目录已经存在'+EOL); //目录存在怎么办?
TheFileList.Free;
TheThread.Connection.Disconnect;
self.Terminate;
exit;
except
TheFileList.Free;
TheThread.Connection.Disconnect;
self.Terminate;
exit;
end;
end;
//如果不存在或授权覆盖则向下--------------2
//for 循环开始
try
For i:=0 to TheFileList.Count-1 do
begin
//组合出新的文件目录名
TargetFile:=TheTDirName+StrUtils.RightStr(TheFileList[i],
Length(TheFileList[i])-Length(TheSDirName));
TheThread.Connection.Write('正在复制文件-Size'+
IntToStr(FileSizeByName(TheFileList[i]))+'字节'+EOL); //发送开始标志
TheThread.Connection.Write(TargetFile+EOL); //文件名
TheThread.Connection.WriteInteger(FileSizeByName(TheFileList[i]));//大小
if ForceDirectories(ExtractFilePath(TargetFile))=false then
begin
TheThread.Connection.Write('远程目录创建失败'+#10#13+
' 请检查磁盘或目录是否可写!'+EOL);
TheThread.Connection.Disconnect;
TheFileList.Free;
Exit;
end;
if CopyFileTo(TheFileList[i],TargetFile)=false then
begin
TheThread.Connection.Write('远程复制失败'+#10#13+
' 请检查目标文件是否存在且不可覆盖!'+EOL);
TheThread.Connection.Disconnect;
TheFileList.Free;
Exit;
end;
end;
//for 循环结束
Except
TheFileList.Free;
TheThread.Connection.Disconnect;
self.Terminate;
end;
try
TheThread.Connection.Write('目录复制完毕'+EOL);
TheFileList.Free;
TheThread.Connection.Disconnect;
self.Terminate;
Except
TheFileList.Free;
TheThread.Connection.Disconnect;
self.Terminate;
end;
end;
destructor TServerCopyThread.Destroy;
begin
inherited destroy;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -