Delphi 目录遍历问题

小弟刚学习Delphi,到遍历目录的时候不知道怎么弄,望各位大侠赐教,不胜感激。我目前的代码如下,只能获取到当前目录下的目录和文件,请问下如何递归获取指定目录下的所有目录... 小弟刚学习Delphi ,到 遍历目录的时候不知道怎么弄,望各位大侠赐教,不胜感激。

我目前的代码如下,只能获取到当前目录下的目录和文件,请问下如何递归获取指定目录下的所有目录和文件,谢谢了。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, StrUtils;

type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
// Function SearchFiles(AppPath:String):Integer;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Function SearchFiles(AppPath:String):Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
SearchFiles('C:\','*.*');
end;

//搜索文件
Function SearchFiles(AppPath,ExtNames:String):Integer;
Var
Search:TSearchRec;
begin
if RightStr(AppPath,1)<>'\' then AppPath=AppPath+'\';
FindFirst(AppPath+ExtNames,faAnyFile,Search);
While FindNext(Search)=0 do
Form1.ListBox1.Items.Add(Search.Name);
end;

end.

由于小弟分用完了,只能说声谢谢了。
展开
 我来答
ftfix23
2011-02-19 · TA获得超过117个赞
知道答主
回答量:212
采纳率:0%
帮助的人:0
展开全部
自认为不是废话,所以回答一下:
------------------------------------------------------------
一般程序的注册表信息写在这个位置:
HKEY_LOCAL_MACHINE\SOFTWARE\<公司名>\程序名\

如Acrobat Reader的安装路径可从以下位置取得:
HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\5.0\InstallPath
-----------------------------------------------------------
JDK 的目录一般就在

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\

但是根据安装的版本不同,会有不同的子目录,比如,1.5版本的信息就放在: HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.5\ 里面,其中
"JavaHome"="X:\XXXXXX\jdk1.5" 这个键值就是他的路径了。

所以你可以用DELPHI遍历 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\ 的所有子目录,找到JavaHome键值就是了。

-----------------------------------------------------------

另一种方法是从程序的反安装信息中找程序路径,控制面板“添加/删除程序”就是调用其下的UninstallString来进行程序反安装的:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

枚举其下所有项,通过DisplayName匹配你要找的程序名,通过UninstallString可得到反安装字串,解析出反安装程序路径——但注意不是所有程序的反安装路径和程序路径是一致的;

如果存在InstallLocation键,且它对应的值不为空,那就是安装路径。

-------------------------------------------
自己做的例子,已经调试通过(最顶上要加 Uses Registry 单元),如果有多个的话,取第一个应该就可以了,我现在用Showmessage都Show出来了:

procedure TForm1.Button1Click(Sender: TObject);
var
Reg: TRegistry;
Val:TStrings;
ii:integer;
TmpStr:String;
begin
Reg:=TRegistry.Create();
Val:=TStringList.Create();
Try
Reg.RootKey:=HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SOFTWARE\JavaSoft\Java Development Kit\',False) then
Reg.GetKeyNames(Val);
//Memo1.Lines.AddStrings(Val);
if Val.Count>1 then
begin
for ii:=0 to Val.Count-1 do
begin
Reg.CloseKey;
if Reg.OpenKey('SOFTWARE\JavaSoft\Java Development Kit\'+Val.Strings[ii],False) then
begin
TmpStr:=Reg.ReadString('JavaHome');
if TmpStr<>'' then
Showmessage(TmpStr);
end;

end;

end;
Finally
Reg.Free;
Val.Free;
end;

end;

//-------加了 Reg.CloseKey;
知道凸凹
2011-02-18 · 超过30用户采纳过TA的回答
知道答主
回答量:117
采纳率:0%
帮助的人:33.9万
展开全部
已经会遍历一上目录下的目录和文件了,遍历所有的目录和文件应该不难了吧,用个递归就行了。
当找到一个目录时还再找这个目录下的目录和文件,直到没有子目录为止,再返回到上一层断续遍历目录和文件,以此类推。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mit1208
2011-02-18 · TA获得超过2347个赞
知道大有可为答主
回答量:2743
采纳率:0%
帮助的人:1854万
展开全部
函数参数:
Path:string 需要遍历的目录 MakeFileList( 'E:\,'.exe') ;
FileExt:string 要遍历的文件扩展名MakeFileList( 'E:\,'.*') ;
function MakeFileList(Path,FileExt:string):TStringList ;
var
sch:TSearchrec;
begin
Result:=TStringlist.Create;

if rightStr(trim(Path), 1) <> '\' then
Path := trim(Path) + '\'
else
Path := trim(Path);

if not DirectoryExists(Path) then
begin
Result.Clear;
exit;
end;

if FindFirst(Path + '*', faAnyfile, sch) = 0 then
begin
repeat
Application.ProcessMessages;
if ((sch.Name = '.') or (sch.Name = '..')) then Continue;
if DirectoryExists(Path+sch.Name) then
begin
Result.AddStrings(MakeFileList(Path+sch.Name,FileExt));
end
else
begin
if (UpperCase(extractfileext(Path+sch.Name)) = UpperCase(FileExt)) or (FileExt='.*') then
Result.Add(Path+sch.Name);
end;
until FindNext(sch) <> 0;
SysUtils.FindClose(sch);
end;
end;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhl_529
2011-02-18 · TA获得超过151个赞
知道小有建树答主
回答量:387
采纳率:72%
帮助的人:95.1万
展开全部
以下是用递归计算一个目录的大小的:
function GetDirectionSize(Path: string; SubDir: Boolean = True): LongInt;
var
Rec: TSearchRec;
Found: Integer;
Size: LongInt;
begin
Size := 0;
if Path[Length(Path)]<>'\' then
Path := Path + '\';
Found := FindFirst(Path + '*.*', faAnyFile, Rec);
while Found = 0 do
begin
Inc(Size, Rec.Size);
if (Rec.Attr and faDirectory > 0) and (Rec.Name[1] <> '.') and SubDir then
Inc(Size, GetDirectionSize(Path + Rec.Name, True));
Found := FindNext(Rec);
Application.ProcessMessages;
end;
SysUtils.FindClose(Rec);
Result := Size;
end;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式