⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tservercopythreadunit.~pas

📁 DELPHI 下远程控制源码
💻 ~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 + -