📄 dloaddirthreadunit.pas
字号:
unit DLoadDirThreadUnit;
interface
uses
Classes,IdTCPServer,SysUtils, IdGlobal,ComCtrls;
type
TDLoadDirThread = class(TThread)
private
{ Private declarations }
ThisUser :String;
ReadTheDir :String;
SysThread :TIdPeerThread;
//---------------单个文件文件发送
procedure SendTheFile(TheFName:String;AThread:TIdPeerThread);
protected
procedure Execute; override;
procedure RegisteLog;
public
constructor Create(AThread:TIdPeerThread;TheUser,TheDLDir:String);
destructor Destroy; override;
procedure SendAllDirFile;
end;
implementation
uses unit2;
//获取指定目录下的所有文件名
procedure GetFileList(ThePath:String;TheList:TStrings);
Var
sr: TSearchRec;
begin
if FindFirst(ThePath+'*.*',faAnyFile, sr) = 0 then
begin
repeat
if (Sr.Attr<16) then
TheList.Add(ThePath+Sr.Name);
if (Sr.Attr>=32) then
if (sr.Attr<48) then
TheList.Add(ThePath+Sr.Name);
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;
end;
FindClose(sr);
end;
constructor TDLoadDirThread.Create(AThread:TIdPeerThread;TheUser,TheDLDir:String);
begin
inherited Create(True);
ThisUser :=TheUser;
SysThread :=AThread;
ReadTheDir :=TheDLDir;
FreeOnTerminate :=False;
end;
//---------------单个文件文件发送
procedure TDLoadDirThread.SendTheFile(TheFName:String;AThread:TIdPeerThread);
var
FromF: file of byte;
FileLen:integer;
NumRead: Integer;
Buf: array[1..32768] of Char;
begin
try
AssignFile(FromF,TheFName);
FileMode:=0;
Reset(FromF);
Seek(FromF,0);
FileLen:=FileSize(FromF);
except
CloseFile(FromF);
exit;
end;
try
AThread.Connection.WriteInteger(FileLen);
except
CloseFile(FromF);
exit;
end;
try
repeat
AThread.Connection.OpenWriteBuffer;
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
AThread.Connection.WriteBuffer(Buf,NumRead);
AThread.Connection.CloseWriteBuffer;
until (NumRead = 0);
except
CloseFile(FromF);
exit;
end;
CloseFile(FromF);
end;
procedure TDLoadDirThread.SendAllDirFile;
var
ReadNextStrID :String;
TheFileName :String;
TheFListStream:TStringStream;
TheFileList :TStringList;
iWriteLen :integer;
begin
Synchronize(RegisteLog);
Try
TheFListStream:=TStringStream.Create('');
TheFileList :=TStringList.Create;
except
SysThread.Connection.Disconnect;
self.Terminate;
exit;
end;
GetFileList(ReadTheDir,TheFileList); //搜集文件列表
TheFileList.SaveToStream(TheFListStream);//
iWriteLen:=TheFListStream.Size;
try
SysThread.Connection.WriteInteger(iWriteLen);
SysThread.Connection.WriteStream(TheFListStream);
except
TheFListStream.Free;
TheFileList.Free;
self.Terminate;
exit;
end;
TheFListStream.Free;
TheFileList.Free;
Repeat
try
ReadNextStrID:=SysThread.Connection.ReadLn(EOL);
if ReadNextStrID='文件连续申请' then
begin
TheFileName:=SysThread.Connection.ReadLn(EOL);
SendTheFile(TheFileName,SysThread);
end;
except
Self.Terminate;
exit;
end;
until ReadNextStrID='可以断开了';
self.Terminate;
end;
procedure TDLoadDirThread.RegisteLog;
var
TheListItem:TListItem;
begin
if Form2.LogCheckBox.Checked=false then exit;
TheListItem:=Form2.ListView5.Items.Insert(0);
TheListItem.Caption:=SysThread.Connection.Socket.Binding.PeerIP;
TheListItem.StateIndex:=9;
TheListItem.SubItems.Add(ThisUser);
TheListItem.SubItems.Add('目录下载');
TheListItem.SubItems.Add(ReadTheDir);
TheListItem.SubItems.Add(DateTimeToStr(now));
end;
procedure TDLoadDirThread.Execute;
begin
end;
destructor TDLoadDirThread.Destroy;
begin
inherited destroy;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -