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.
由于小弟分用完了,只能说声谢谢了。 展开
我目前的代码如下,只能获取到当前目录下的目录和文件,请问下如何递归获取指定目录下的所有目录和文件,谢谢了。
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.
由于小弟分用完了,只能说声谢谢了。 展开
4个回答
展开全部
自认为不是废话,所以回答一下:
------------------------------------------------------------
一般程序的注册表信息写在这个位置:
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;
------------------------------------------------------------
一般程序的注册表信息写在这个位置:
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;
展开全部
已经会遍历一上目录下的目录和文件了,遍历所有的目录和文件应该不难了吧,用个递归就行了。
当找到一个目录时还再找这个目录下的目录和文件,直到没有子目录为止,再返回到上一层断续遍历目录和文件,以此类推。
当找到一个目录时还再找这个目录下的目录和文件,直到没有子目录为止,再返回到上一层断续遍历目录和文件,以此类推。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
函数参数:
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;
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;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
以下是用递归计算一个目录的大小的:
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;
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;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询