我知道怎么在某个目录里搜索1个指定文件名的文件。但如果要搜索多个文件 应该在哪个地方做改进?搜索多个文件的话是不是要建一个TStringList,把所有要查找的文件名都存入这个字符串列表中,再做个循环 for i:=0 to StringList.count-1 do,在这个循环中在findfirst,findnext, 我现在的想法就是这样,但不好检验,也不知道对不对,因为搜索还有个效率的问题,我不知道这样的效率怎样,大家可以给点意见吗?搜索指定的某个文件的代码如下
function CurrentIsValidDir(SearchRec:TSearchRec):integer;
procedure RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);function TForm1.CurrentIsValidDir(SearchRec:TSearchRec):integer;//这是检验文件夹是否合法
begin
if ((SearchRec.Attr <> 16) and
(SearchRec.Name<>'.') and
(SearchRec.Name<>'..')) then
Result:=0
else if ((SearchRec.Attr = 16) and
(SearchRec.Name<>'.') and
(SearchRec.Name<>'..')) then
Result:=1
else
Result:=2;
end;Procedure TForm1.RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);
var
i:integer;
Subdir:TStringList;
SearchRec:TsearchRec;
begin
//调用FindFirst和FindNext查找符合要求的文件
if (FindFirst(CurrentDir+SearchFileType, faAnyFile, SearchRec)=0) then
begin
repeat
if CurrentIsValidDir(SearchRec)=0 then
begin
Inc(Number);
Searchresult.Add(CurrentDir+SearchRec.Name);
end;
application.ProcessMessages ;
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);//查找各子目录。
Subdir:=TStringList.Create;
if (FindFirst(CurrentDir+'*.*', faDirectory, SearchRec)=0) then
begin
repeat
if CurrentIsValidDir(SearchRec)=1 then
begin
Subdir.Add(SearchRec.Name);
end;
application.ProcessMessages ;
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);
for i:=0 to Subdir.Count-1 do
begin
RecurSearchfile(CurrentDir+Subdir.Strings[i]+'\',SearchFileType,Searchresult,Number);
end; Subdir.Free;
end;
function CurrentIsValidDir(SearchRec:TSearchRec):integer;
procedure RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);function TForm1.CurrentIsValidDir(SearchRec:TSearchRec):integer;//这是检验文件夹是否合法
begin
if ((SearchRec.Attr <> 16) and
(SearchRec.Name<>'.') and
(SearchRec.Name<>'..')) then
Result:=0
else if ((SearchRec.Attr = 16) and
(SearchRec.Name<>'.') and
(SearchRec.Name<>'..')) then
Result:=1
else
Result:=2;
end;Procedure TForm1.RecurSearchFile(CurrentDir:string;SearchFileType:string;SearchResult:TStrings;var Number:integer);
var
i:integer;
Subdir:TStringList;
SearchRec:TsearchRec;
begin
//调用FindFirst和FindNext查找符合要求的文件
if (FindFirst(CurrentDir+SearchFileType, faAnyFile, SearchRec)=0) then
begin
repeat
if CurrentIsValidDir(SearchRec)=0 then
begin
Inc(Number);
Searchresult.Add(CurrentDir+SearchRec.Name);
end;
application.ProcessMessages ;
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);//查找各子目录。
Subdir:=TStringList.Create;
if (FindFirst(CurrentDir+'*.*', faDirectory, SearchRec)=0) then
begin
repeat
if CurrentIsValidDir(SearchRec)=1 then
begin
Subdir.Add(SearchRec.Name);
end;
application.ProcessMessages ;
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);
for i:=0 to Subdir.Count-1 do
begin
RecurSearchfile(CurrentDir+Subdir.Strings[i]+'\',SearchFileType,Searchresult,Number);
end; Subdir.Free;
end;
调用api函数,将一个目录下的所有文件名读出?
ID=1838115, 发贴富翁: liu2909432, 发贴时间:2003-5-10 5:38:00调用api函数,将一个目录下的所有文件名读出?
急!急!
RE: 调用api函数,将一个目录下的所有文件名读出?
ID=1838591, 发贴富翁: 太阳火, 发贴时间:2003-5-7 9:15:00不是用api函数。
用TSearchRec结构。自己看看帮助,或者搜索一下以前的帖子,太多了!
RE: 调用api函数,将一个目录下的所有文件名读出?
ID=1838617, 发贴富翁: jrq, 发贴时间:2003-5-7 9:22:00刚好手边有,贴上来供参考://+-------------------------------------------+
//| 得到指定路径下的所有文件列表 |
//+-------------------------------------------+
function Get_File(Path:string):TStrings; //Path就是制定的路径,得到文件的列表以TStrings返回
const FileAttrs = faAnyFile and (not fadirectory);
var
SRec: TSearchRec;
FindResult:Integer;
begin
Result:=TStringList.Create;
FindResult:=FindFirst (Path+'\'+'*.*', FileAttrs, SRec);
//^^^^^------此处可以进行文件类型的过滤
while FindResult= 0 do
begin
if (SRec.Name <> '.') and (SRec.Name <> '..') then
begin
Result.Add(SRec.Name);
FindResult:=FindNext(SRec);
end;
end;
FindClose (SRec);
end;
{ 子目录遍历的递归算法 }
var sr : TSearchRec;
err: integer;
begin
chdir(path);
err := findfirst('*.*', faAnyFile, sr);
while err = 0 do begin
if (sr.Name <> '.')and(sr.Name <> '..') then
if (sr.Attr and faDirectory)<>0 then begin
inc(dCount);
MakeTree((sr.Name));
chdir('..');
end
else inc(fCount);
err := findnext(sr);
end;
findclose(sr);
end;
改成
if (FindFirst(CurrentDir+'*.asp;*.bin;*.exe;*.dll;*.ocx', faDirectory, SearchRec)=0) then
这样就可以啊。