求遍历目录的算法(300分)

  • 主题发起人 主题发起人 xzfxzf
  • 开始时间 开始时间
X

xzfxzf

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在做的一个程序是用递归算法遍历整个硬盘的,但是,大家都知道,递归算法有很多的缺点,效率不高。能有更快,更好的算法吗?(如递推算法就比递归好,只是我不知道如何用递推)谢谢大家
 
先以 FindFirst() 取得第一个档案并建立TSearchRec的搜寻记录,然後以TSearchRec传入FindNext()继续找下一个就可以逐一找出所有档案.

procedure TForm1.Button1Click(Sender: TObject);
var
iFindResult: integer;
SearchRec: TSearchRec;
begin
iFindResult := FindFirst('d:/temp/temp6/*.*', faAnyFile, SearchRec);
while iFindResult = 0 do
begin
ListBox1.Items.Add(SearchRec.Name);
iFindResult := FindNext(SearchRec);
end;
FindClose(SearchRec);
end;
 
这个还是递归的
 
http://www.vclxx.org/DELPHIGB/AAAT1029.HTM
FILEFND1.ZIP

能够搜寻磁碟中某一特定文件的构件,能够递回搜寻磁碟路径 ( 1.1 版,附源码 ) ,作者 : Jem Ahmed。
还有很多,自己找一下比较看?
 
这个控件也是通过递归调用的,效率还是不好。没有高手了吗?
 
怎么可能呢?明显不具有递推特性的问题,一定要使用递推来解?如果已知一个文件,递推
求总路径还好说,搜索整个硬盘获取全部文件列表怎么使用递推?
 
因为我对递推不是太了解,只是知道所有递归的问题理论上都可以用递推方法解的。所以,还是去多看看书吧:)谢了
 
http://kingron.delphibbs.com/dispbbs.asp?boardID=16&ID=153&page=1
利用递归和Shell系统文件缓存来的,速度非常快~~~~~~~,特别是重复扫描的时候,其实你的速度慢,是在磁盘读取导致的,内存操作是很快的,堆栈Push和Pop很快的~~~~~~~~~~~~
 
如楼上所言,我定的程序在重复扫描的时候非常慢,但是,在首次运行的时候却非常慢,我是想改变首次运行时的速度,因为,毕竟没有人会把某一个程序去运行第二遍才用,你说呢?:)虽然我已做的大量优化,部份代码还使用汇编,但是,没有办法改变第一次运行速度慢的问题,麻烦呀
 
还有 http://kingron.delphibbs.com/dispbbs.asp?boardID=16&ID=153&page=1页打不开呀,说页面不存在
 
需要注册的,你注册登陆后,再打开就可以看到了。
 
或者请到共享资料里面去找一下即可:与众不同的查找目录下所有文件的方法
 
我有遍历每一个分区,每一个文件夹的代码,可是是递归的
 
我自创的查找算法,不用递归,速度快,可显示进度

{
参数:
DirName 查找的目录
FileList 找到的文件, 需要调用前创建
IncSubDir 是否包括子目录,True包括,否则不包括。默认包括子目录。
}
procedure FindFile(DirName:string;var FileList:TStrings
IncSubDir:boolean=True);
var DS:TSearchRec;
i,p:integer;
Path:string;
DirList:TStrings;
begin
i := 0;
DirName :=ExcludeTrailingPathDelimiter(DirName);
DirList := TStringList.Create;
DirList.Add(DirName);
while i < DirList.Count do
begin
Path := DirList.Strings + '/';
if FindFirst(Path + '*.*', faAnyFile, Ds) = 0 then
repeat
if (Ds.Attr and faDirectory) = 0 then
FileList.Add(Path + Ds.Name)
else
if IncSubDir and (Ds.Name[1] <> '.') then
DirList.Add(Path + Ds.Name);
until FindNext(Ds) <> 0;
Inc(i);
//显示进度
p := i * 100 div DirList.Count;
if p > Form1.ProgressBar1.Position then
Form1.ProgressBar1.Position := p;
FindClose(Ds);
end;
DirList.Free;
end;


procedure TForm1.Button1Click(Sender: TObject);
var FileList:TStrings;
begin
FileList := TStringList.Create;
FindFile('c:', FileList)
//查找C盘所有文件
FileList.Free;
end;
 
嗯,用dirlist暂存目录来代替递归,效率略高于用递归的算法,但是也一样,在第一次运行时速度慢
 
不知道你们在搞什么,递归????

人老了,看不懂。
 
第一次要读硬盘,不能在快了,而第二次直接读缓存,速度当然快。
 
后退
顶部