查找一个具体的文件(30分)

  • 主题发起人 主题发起人 zhsh
  • 开始时间 开始时间
Z

zhsh

Unregistered / Unconfirmed
GUEST, unregistred user!
查找硬盘上所有文件,可用递归完成。如果只查找某种文件,如'.bmp',在
TreeView中列出含bmp文件的目录节点,其它不含bmp的目录不列出,请问该
算法如何完成,请给出代码
 
不还是递归吗?有什么不同?
procedure addBmpDir(ATreeView:TTreeview;ADir:string);
var temp_TreeItem;
//好像是这个吧,还是查查帮助吧。
begin
if has_bmp_in_this_dir then
begin
temp_treeitem:=Atreeview.items.add;
temp_treeitem.caption:=.....
...
...
end;

// get subdirs;
// for each subdir:
addBMPDir( ATreeview,subdir[x]);
end;
 
用老方法
只要在最后查找一下没有文件的目录,删除之不得了?
 
曹晓刚的伪代码忘了一点,那就是要把当前的TreeNode作为参数传递,否则
不是都加到根节点下面去了?
 
是啊是啊。不好意思。
我当成listview了,以为是像win95里的"查找"一样。
 
只花30分买到程序,节省自己大量的编程时间和调试时间。
太便宜了。
 
先查再删决不可取。
has bmp in dir如何实现,递归是个压栈过程,而向TreeView里加节点与弹栈的
次序相反,请写具体点好吗?
 
俺觉得用递归不好,万一目录很深,对系统可是个很大的开销啊,
最好用栈比较好
 
zhsh:
>先查再删决不可取。
什么意思?
是指节点的删除吗?
> has bmp in dir如何实现,
这个...
FindFileFirst( )...
FindFileNext( )...
> 递归是个压栈过程,而向TreeView里加节点与弹栈的
> 次序相反,
这又是什么意思?
你是想让每次弹栈的时候再加入TreeView?
我是先遍历当前目录,再查找子目录的,
把当前目录下的文件认为是节点的内容,这正好是一个树的前序遍历算法啊。
kane:
>俺觉得用递归不好,万一目录很深,对系统可是个很大的开销啊,
> 最好用栈比较好
递归不就是用栈吗?只不过用的是delphi的调用栈,或者是程序的堆栈段.
如果你想要自己开栈,其实是完全一样的。还不如在delphi里把栈设的大一点。
对于这种应用,最多不会超过几十层,肯定不会有问题。
系统开销大倒是有点,不过为了这种事情,再去自己写迭代算法,
是不是有点浪费开发时间?
 
曹晓钢:“你是想让每次弹栈的时候再加入TreeView?”什么意思,请问你在什么时候把节点加入TreeView。 我的做法是先遍历硬盘,如为子目录则进入继续搜索,
如果是文件则判断其类型,如果满足则往TreeView中加入节点,为此自己作了一个
辅助的栈,请问思路是否有问题?您能否写得具体一些,即使是伪代码也具体一点。
 
如果我没有记错的话,WinAPI中有现成的例程可用,为什么还要自己做呢?
 
>如果我没有记错的话,WinAPI中有现成的例程可用,为什么还要自己做呢?
好象没有
我的意思是,先全部便利,写入TREEVIEW或类似的数据结构
删除空的接点,然后放入TREEVIEW
 
晓刚的做法是标准做法。当然把递归算法化为非递归,效率可能会有提高,但是
就这个问题好像不值得。
 
以下这段代码是浏览硬盘上所有文件夹,并把文件夹的内容作为节点加入到TreeView中,如果找到bmp文件,则加入到下一级中.请就这段代码指正,只将含有bmp的文件夹作为节点加入到TreeView中
另 请问CJ,WinApi 中现成的例程是什么?
procedure TApplyForm.SearchNewFile( pathfile : string;
ParentNode: TTreeNode );
var
SearchRec : TSearchRec;
IFound : integer;
newnode : TTreeNode;
FileNode : TTreeNode;
ExtName : string;
begin
IFound := FindFirst( pathfile + '/*.*', faAnyFile, SearchRec );
While IFound = 0do
begin
StatusBar1.Panels[0].Text := '目录检索中';
if ( SearchRec.Attr = faDirectory ) and ( SearchRec.Name <> '.' )
and ( SearchRec.Name <> '..' ) then
begin
newnode := TreeView1.Items.AddChild( ParentNode, SearchRec.Name );
newnode.ImageIndex := 3;
newnode.SelectedIndex := 3;
//SearchNewFile( pathFile + '/' + SearchRec.Name, newnode );
SearchNewFile( pathFile + '/' + SearchRec.Name, newnode );
end
else
begin
ExtName := ExtractFileExt( SearchRec.Name );
if ExtName = '.bmp' then
begin
FileNode := TreeView1.Items.AddChild( ParentNode, ExtractFileName( SearchRec.Name) );
FileNode.ImageIndex := 4;
FileNode.SelectedIndex := 4;
end;
end;
IFound := FindNext( SearchRec );
end;
StatusBar1.Panels[0].Text := '就绪';
FindClose( SearchRec );
end;
 
我这里有个控件,附源码,已寄到您的邮箱,希望对您有一点点帮助。*_*
说明如下:
能够快速搜寻某个特定文件的构件,并能将搜寻结果储存於一个 TStringList 类中 ( 2.0.3.0 版,附源码 ),作者 : Alexander Burlakov aka Hunter。

 
接受答案了.
 
后退
顶部