📄 unittransfer.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 + -