📄 searchhostthreadunit.pas
字号:
unit SearchHostThreadUnit;
interface
uses Windows, Messages, SysUtils, Classes,ComCtrls,Dialogs,main;
type
TSearchHostThread=class(TThread)
private
MyDir, FileName, FullFileName: string;
FindfNode: TtreeNode;
ftype: FileType;
EverFound,NeedLogin,NoShareDir,NoShareFile,isWinNT,NeedPassWord,bPrinter: boolean;
FileList: TStringList;
NoPassWordChicken: boolean;
SizeList: TStringList;
FileSize: DWORD;
public
MyTree: TTreeView;
MyNode: TtreeNode;
MyGroup,MyHost: string;
User, PassWord: string;
//hFlag: THandle;
protected
procedure Execute; override;
procedure findf(dir:string);
procedure AddDirNode;
Procedure AddDir;
Procedure AddFile;
procedure CompareFile;
procedure NotFound;
procedure BeFound;
procedure AddToHistory; //###
procedure GetUserPassWord;
end;
implementation
uses Config;
procedure TSearchHostThread.GetUserPassWord;
begin
with ConfigForm do
begin
GiveUserPassWord(MyHost, User, PassWord);
end;
end;
procedure TSearchHostThread.AddToHistory;
const
ShareHostSet = [8, 29, 27];
var
TemHisNode, HisGroupNode: TTreeNode;
i: integer;
MyItemPtr : PMyTreeItem;
begin
with MainForm do
begin
if (cbSaveOpt.Checked)and(not(MyNode.ImageIndex in ShareHostSet)) then exit;
if MyTree = HistoryTree then exit;
//###############add to history tree##############
HisGroupNode := nil;
for i := 0 to HistoryTree.Items[0].Count - 1 do
if UpperCase(trim(HistoryTree.Items[0].Item[i].Text)) = UpperCase(trim(MyGroup)) then
begin
HisGroupNode := HistoryTree.Items[0].Item[i];
end;
if HisGroupNode = nil then
begin
HisGroupNode := HistoryTree.Items.AddChild(HistoryTree.Items[0], MyGroup);
HisGroupNode.ImageIndex := 9;
HisGroupNode.SelectedIndex := 9;
HistoryTree.Items[0].Expand(false);
end;
for i := 0 to HisGroupNode.Count - 1 do
if UpperCase(HisGroupNode.Item[i].Text) = UpperCase(MyHost) then exit; //already exist
New(MyItemPtr);
MyItemPtr^.DirName :=MyHost;
MyItemPtr^.Group :=MyGroup;
TemHisNode := HistoryTree.Items.AddChild(HisGroupNode, MyHost);
TemHisNode.Data := MyItemPtr;
TemHisNode.ImageIndex := 7;
TemHisNode.SelectedIndex :=12;
HisGroupNode.Expand(false);
//################################################
end;
end;
procedure TSearchHostThread.AddFile;
begin
with MainForm do
begin
AllListbox.items.insert(0, FullFileName);
end;
end;
procedure TSearchHostThread.AddDir; //in Right ListView
var
ListItem : TListitem;
ListItemPtr : PListItem;
begin
with MainForm do
begin
if bAutoSearch then
begin
with ShareListView do
begin
ListItem:=Items.Insert(0);
if bPrinter then ListItem.ImageIndex := 77
else if EverFound then listitem.ImageIndex := 0
else if NeedPassWord then ListItem.ImageIndex := 20
else if NoShareFile then
begin
ListItem.ImageIndex := 30;
ListItem.StateIndex :=30;
end
else ListItem.ImageIndex:=19;
ListItem.Caption := ExtractFileName(mydir);
ListItem.SubItems.Add(mydir);
ListItem.SubItems.Add(mygroup);
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
new(ListItemPtr);
ListItemPtr.index := StrListAll.Count;
StrListAll.AddStrings(FileList);
SizeListAll.AddStrings(SizeList);
ListItemPtr.count := FileList.Count;
ListItem.data := ListItemPtr;
//==============================
ListItemPtr.PrevDirItem := nil;
ListItemPtr.NextDirItem := nil;
ListItemPtr.UpDirItem := nil;
//==============================
//##################in the tree############3
pMyTreeItem(findfnode.data)^.MyRightListItem := ListItem;
CheckFile(MyDir, MyDir, MyGroup, 0, FileSize);
end;
end;
end;
end;
procedure TSearchHostThread.AddDirNode; //in left lan tree;
var
item: TTreeNode;
MyItemPtr : PMyTreeItem;
begin
with MainForm do
begin
// Add node to the tree
New(MyItemPtr);
MyItemPtr^.dirName := MyDir;
MyItemPtr^.group := pMyTreeItem(MyNode.data)^.group; //mynode is host
item:=MyTree.Items.AddChild(MyNode,ExtractFileName(MyDir)); // item is share dir
item.Data := MyItemPtr;
if bPrinter then
begin
item.ImageIndex := 77;
item.SelectedIndex := 77;
end;
FindfNode:= item;
MyNode.ImageIndex :=8;
MyNode.SelectedIndex :=8;
end;
end;
procedure TSearchHostThread.CompareFile;
begin
with MainForm do
begin
if ftype= IsFile then CheckFile(FileName, MyDir, MyGroup, 1, FileSize)
else CheckFile(FileName, MyDir, MyGroup, 0, FileSize);
end;
end;
procedure TSearchHostThread.Findf(dir:string);
var
Found : integer;
SearchRec : TSearchRec;
result : dWord;
NR : TNetResource;
CanOpenDir : boolean;
TemNode : TTreeNode;
MyItemPtr : PMyTreeItem;
begin
with MainForm do
begin
EverFound:=false;
NoShareFile:=false;
CanOpenDir:=false;
FindfNode.ImageIndex := 6;
FindfNode.SelectedIndex := 6;
Found := FindFirst(dir+'\*.*', faAnyFile, SearchRec);
while Found = 0 do
begin
CanOpenDir:=true;
if(SearchRec.Name<>'.')and(SearchRec.Name<>'..') then
begin //add files or folders
EverFound := true;
FileName := SearchRec.Name;
FileSize := SearchRec.Size;
if ((SearchRec.Attr and faDirectory)<>0) then ftype:=IsDir else ftype:=IsFile;
//temdir:=dir;
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
if ftype = IsDir then FullFileName := dir+'\'+filename+'\'
else FullFileName := dir+'\'+filename;
Synchronize(AddFile);
FileList.Add(FullFileName);
SizeList.Add(inttostr(FileSize));
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
if ftype=IsDir then
begin
New(MyItemPtr);
MyItemPtr^.DirName := FullFileName;
MyItemPtr^.Group := MyGroup;
TemNode := Mytree.Items.AddChild(findfnode,FileName);
TemNode.Data := MyItemPtr;
TemNode.ImageIndex := 0;
if recursive then findf(dir+'\'+SearchRec.Name); //递归搜索
end;
Synchronize(CompareFile);
end;
Found := FindNext(SearchRec);
if stop then exit;
if terminated then exit;
end;
FindClose(SearchRec);
if EverFound then
begin
FindfNode.ImageIndex := 10;
FindfNode.SelectedIndex := 10;
pMyTreeItem(findfnode.data)^.tabindex := 0; //#########
end
else //not EverFound
begin
if CanOpenDir then
begin
FindfNode.ImageIndex := 30; //can open, but no file
NoShareFile:=true;
end
else
begin //test password
with NR do
begin
dwType := RESOURCETYPE_ANY;
lpLocalName := pchar('z:');
lpRemoteName := pchar(mydir);
lpProvider := '';
end;
result:= WNetAddConnection2(NR, pchar(''), pchar('guest'),CONNECT_UPDATE_PROFILE);
case result of
ERROR_INVALID_PASSWORD:
begin
FindfNode.ImageIndex := 20;
FindfNode.SelectedIndex :=20;
FindfNode.StateIndex := 20;
NeedPassWord:=true;
end;
else FindfNode.ImageIndex := 19;
end; // end of case
WNetCancelConnection2('z:', CONNECT_UPDATE_PROFILE, FALSE);
end; //end of test password
end;
end;
end;
procedure TSearchHostThread.NotFound;
begin
with MainForm do
begin
//ListBox1.Items.Add(MyHost+inttostr(handle)); ///
if not NeedLogin then
begin
if NoShareDir then
begin
MyNode.ImageIndex :=27;
MyNode.SelectedIndex :=27;
end
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -