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

📄 unittransfer.pas

📁 远程控制软件
💻 PAS
字号:
unit UnitTransfer;

interface

uses Windows, SysUtils, ScktComp;

type TThreadInfo = class(TObject)
  public
    host: string;
    port: integer;
    SH: string;
    Action: string;
    FileName: AnsiString;
    RemoteFileName: AnsiString;
    ThreadId: LongWord;
    Beginning: Integer;
    UploadSize: int64;
    constructor Create(pHost: string; pPort: integer; pSH, pFilename, pAction: AnsiString; pBeginning: integer); overload;
  end;


procedure ThreadedTransfer(Parameter: Pointer);
procedure SendFile(ClientSocket: TClientSocket; Path: AnsiString; Beginning: int64);
procedure GetFile(ClientSocket: TClientSocket; localPath: AnsiString; filesize: Integer);
function ReadLine(ClientSocket: TClientSocket): string;
function GetFileSize(FileName: string): Int64;


const
  ENTER = #10;

implementation

constructor TThreadInfo.Create(pHost: string; pPort: integer; pSH, pFilename, pAction: AnsiString; pBeginning: integer);
begin
  Host := pHost;
  Port := pPort;
  SH := pSH;
  FileName := pFileName;
  Action := pAction;
  Beginning := pBeginning;
end;

function ReadLine(ClientSocket: TClientSocket): string;
var
  buf: char;
begin
  buf := ' ';
  while buf <> #10 do
  begin
    ClientSocket.Socket.ReceiveBuf(buf, 1);
    Result := Result + buf;
  end;
  Result := Trim(Result);
end;

procedure ThreadedTransfer(Parameter: Pointer);
var
  ThreadInfo: TThreadInfo;
  SocketTransf: TClientSocket;
  FileSize: Integer;
begin
  ThreadInfo := TThreadInfo(Parameter);
  SocketTransf := TClientSocket.Create(nil);
  SocketTransf.Host := ThreadInfo.host;
  SocketTransf.Port := ThreadInfo.port;
  SocketTransf.ClientType := CtBlocking;
  SocketTransf.Open;
  if SocketTransf.Socket.Connected then
  begin
    SocketTransf.socket.SendText('SH|' + ThreadInfo.SH + ENTER);
    FileSize := GetFileSize(ThreadInfo.FileName);
    if ThreadInfo.Action <> 'SENDFILE' then
    begin
      SocketTransf.Socket.SendText(ThreadInfo.Action + '|' + ThreadInfo.FileName + '|' + IntToStr(FileSize) + ENTER);
      SendFile(SocketTransf, ThreadInfo.FileName, ThreadInfo.Beginning);
    end
    else
    begin
      SocketTransf.Socket.SendText(ThreadInfo.Action + '|' + ThreadInfo.RemoteFileName + ENTER);
      ReadLine(SocketTransf);
      GetFile(SocketTransf, ThreadInfo.FileName, ThreadInfo.UploadSize);
    end;
  end;
end;

procedure SendFile(ClientSocket: TClientSocket; Path: AnsiString; Beginning: int64);
var
  Fichero: file;
  byteArray: array[0..1023] of byte;
  count, filesize: integer;
begin
  try
    FileSize := GetFileSize(Path);
    FileMode := $0000;
    AssignFile(Fichero, path);
    Reset(Fichero, 1);
    Seek(Fichero, beginning);
    while not EOF(Fichero) and ClientSocket.socket.Connected do
    begin
      BlockRead(Fichero, byteArray, 1024, count);
      ClientSocket.socket.SendBuf(bytearray, count);
    end;
    Closefile(Fichero);
  except
    Closefile(Fichero);
  end;
end;


procedure GetFile(ClientSocket: TClientSocket; localPath: AnsiString; filesize: Integer);
var
  Fichero: file;
  ByteArray: array[0..1023] of byte;
  TotalRead, currRead: integer;
  CurrWritten: integer;
  Excepcion: boolean;
begin
  try
    Excepcion := false;
    AssignFile(Fichero, localPath);
    Rewrite(Fichero, 1);
    Totalread := 0;
    CurrRead := 0;
    while ((TotalRead < filesize)) do
    begin
      CurrRead := ClientSocket.Socket.ReceiveBuf(byteArray, sizeof(bytearray));
      TotalRead := TotalRead + CurrRead;
      BlockWrite(Fichero, ByteArray, CurrRead, CurrWritten);
      CurrWritten := Currread;
    end;
  except
    Excepcion := True;
    CloseFile(Fichero);
    if ClientSocket.Socket.Connected then ClientSocket.Close;
    ClientSocket.Free;
  end;
  if not Excepcion then
  begin
    CloseFile(Fichero);
    if ClientSocket.Socket.Connected then ClientSocket.Close;
    ClientSocket.Free;
  end;
end;

function GetFileSize(FileName: string): Int64;
var
  H: THandle;
  fData: tWin32FindData;
begin
  Result := -1;
  H := FindFirstFile(pChar(FileName), fData);
  if H <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(H);
    Result := Int64(fData.nFileSizeHigh) shl 32 + fData.nFileSizeLow;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -