要求对指定目录下的文件
指定目录
│┌──目录 │─子目录
││ │ │─文件(满足条件的)
│┥──目录─┤─子目录─┤─文件(..)
│ │ │─ …………
│──目录 │─子目录………………
│ │─文件(..)
│ │─文件(..)
│──文件(..) …………………………只要能完成上面三层的遍历就行了,当然更多层更好。已经完成了指定目录下对目录和文件的查找。然而在查找下一层的子目录和文件时发生了一点问题,看我的源码(查找子目录跟文件的过程)procedure TMainForm.MakeChild(TreeNode: TfcTreeNode);
var
SearchRec: TSearchRec;
ChildNode: TfcTreeNode;
begin
if FindFirst('*.*', $37, SearchRec) = 0 then
if ((SearchRec.Attr and faDirectory) = 0) and
(UpperCase(ExtractFileExt(SearchRec.Name))= '.TXT')then
begin
ChildNode := tvMain.Items.AddChild(tvMain.Selected,
Copy(SearchRec.Name, 1, Length(SearchRec.Name) - 4));
ChildNode.StringData := ExpandFileName(SearchRec.Name);
end;
if ((SearchRec.Attr and faDirectory) = faDirectory) and
(SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
begin
ChildNode := tvMain.Items.AddChild(tvMain.Selected, SearchRec.Name);
ChildNode.ImageIndex := 0;
ChildNode.SelectedIndex := 1;
end;
while (FindNext(SearchRec) = 0) do
if (SearchRec.Attr and faDirectory) = 0) and
(UpperCase(ExtractFileExt(SearchRec.Name)) = '.TXT')then
begin
ChildNode := tvMain.Items.AddChild(tvMain.Selected,
Copy(SearchRec.Name, 1, Length(SearchRec.Name) - 4));
ChildNode.StringData := ExpandFileName(SearchRec.Name);
end; //去掉;
//else
if ((SearchRec.Attr and faDirectory) = faDirectory) and
(SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
begin
ChildNode := tvMain.Items.AddChild(tvMain.Selected, SearchRec.Name);
ChildNode.ImageIndex := 0;
ChildNode.SelectedIndex := 1;
ChildNode.Selected := True;
ChDir(SearchRec.Name);
MakeChild(ChildNode);
ChDir('..');
end;
FindClose(SearchRec);
end;如果按照上面的执行,那么只能找到一个子目录以及它下面的文件。如果按照注释里面的修改后执行,能查找到所有子目录跟文件 但是所有的子目录及其下的文件甚至目录下的一些文件都归结到一个子目录的节点下面。 哪位高手看看能不能改一下,或者另给出一个完整例程。
指定目录
│┌──目录 │─子目录
││ │ │─文件(满足条件的)
│┥──目录─┤─子目录─┤─文件(..)
│ │ │─ …………
│──目录 │─子目录………………
│ │─文件(..)
│ │─文件(..)
│──文件(..) …………………………只要能完成上面三层的遍历就行了,当然更多层更好。已经完成了指定目录下对目录和文件的查找。然而在查找下一层的子目录和文件时发生了一点问题,看我的源码(查找子目录跟文件的过程)procedure TMainForm.MakeChild(TreeNode: TfcTreeNode);
var
SearchRec: TSearchRec;
ChildNode: TfcTreeNode;
begin
if FindFirst('*.*', $37, SearchRec) = 0 then
if ((SearchRec.Attr and faDirectory) = 0) and
(UpperCase(ExtractFileExt(SearchRec.Name))= '.TXT')then
begin
ChildNode := tvMain.Items.AddChild(tvMain.Selected,
Copy(SearchRec.Name, 1, Length(SearchRec.Name) - 4));
ChildNode.StringData := ExpandFileName(SearchRec.Name);
end;
if ((SearchRec.Attr and faDirectory) = faDirectory) and
(SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
begin
ChildNode := tvMain.Items.AddChild(tvMain.Selected, SearchRec.Name);
ChildNode.ImageIndex := 0;
ChildNode.SelectedIndex := 1;
end;
while (FindNext(SearchRec) = 0) do
if (SearchRec.Attr and faDirectory) = 0) and
(UpperCase(ExtractFileExt(SearchRec.Name)) = '.TXT')then
begin
ChildNode := tvMain.Items.AddChild(tvMain.Selected,
Copy(SearchRec.Name, 1, Length(SearchRec.Name) - 4));
ChildNode.StringData := ExpandFileName(SearchRec.Name);
end; //去掉;
//else
if ((SearchRec.Attr and faDirectory) = faDirectory) and
(SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
begin
ChildNode := tvMain.Items.AddChild(tvMain.Selected, SearchRec.Name);
ChildNode.ImageIndex := 0;
ChildNode.SelectedIndex := 1;
ChildNode.Selected := True;
ChDir(SearchRec.Name);
MakeChild(ChildNode);
ChDir('..');
end;
FindClose(SearchRec);
end;如果按照上面的执行,那么只能找到一个子目录以及它下面的文件。如果按照注释里面的修改后执行,能查找到所有子目录跟文件 但是所有的子目录及其下的文件甚至目录下的一些文件都归结到一个子目录的节点下面。 哪位高手看看能不能改一下,或者另给出一个完整例程。
{ 返回系统图标到图形列表中是否成功 }
var
vHandle: THandle;
vSHFileInfo: TSHFileInfo;
begin
FillChar(vSHFileInfo, SizeOf(vSHFileInfo), 0);
vHandle := SHGetFileInfo('', 0, vSHFileInfo, SizeOf(vSHFileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
Result := vHandle <> 0;
mImageList.Handle := vHandle;
mImageList.ShareImages := True;
end; { GetSystemImageList }function GetIconIndex(mPath: string): Integer;
{ 返回文件或路径所对应的图标序号 }
var
vSHFileInfo: TSHFileInfo;
begin
FillChar(vSHFileInfo, SizeOf(vSHFileInfo), 0);
SHGetFileInfo(PChar(mPath), 0, vSHFileInfo, SizeOf(vSHFileInfo),
SHGFI_SYSICONINDEX);
Result := vSHFileInfo.iIcon;
end; { GetIconIndex }procedure PathToTreeNode(mDirName: string; mTreeView: TTreeView;
mTreeNode: TTreeNode);
{ 返回目录转换成菜单项是否成功 }
var
vSearchRec: TSearchRec;
vPathName: string;
K: Integer;
vTreeNode: TTreeNode;
begin
if not Assigned(mTreeView) then Exit;
vPathName := mDirName + '\*.*';
K := FindFirst(vPathName, faAnyFile, vSearchRec);
while K = 0 do begin
if (vSearchRec.Attr and faDirectory <> 0) and
(Pos(vSearchRec.Name, '..') = 0) then begin
vTreeNode := mTreeView.Items.AddChild(mTreeNode, vSearchRec.Name);
vTreeNode.ImageIndex := GetIconIndex(mDirName + '\' + vSearchRec.Name);
PathToTreeNode(mDirName + '\' + vSearchRec.Name, mTreeView, vTreeNode)
end else if (Pos(vSearchRec.Name, '..') = 0) then begin
vTreeNode := mTreeView.Items.AddChild(mTreeNode, '[' + vSearchRec.Name + ']');
vTreeNode.ImageIndex := GetIconIndex(mDirName + '\' + vSearchRec.Name);
end;
K := FindNext(vSearchRec);
end;
FindClose(vSearchRec);
end; { PathToTreeNode }procedure TForm1.FormCreate(Sender: TObject);
begin
GetSystemImageList(ImageList1);
end;procedure TForm1.Button1Click(Sender: TObject);
var
vDirectory: string;
begin
if not SelectDirectory('Select Directory', '', vDirectory) then Exit;
TreeView1.Items.BeginUpdate;
try
TreeView1.Items.Clear;
PathToTreeNode(vDirectory, TreeView1, TreeView1.TopItem);
finally
TreeView1.Items.EndUpdate;
end;
end;
你的代码编译通不过,获取图标和转换成菜单项是什么意思。
初学delphi,请解释清楚一些好吗。
你的代码,把
“.AddChild(tvMain.Selected,”
替换成:
“.AddChild(TreeNode,”