为什么在只读或隐藏属性的目录中查找不到文件呢?详细代码见内!(100分)

D

Dephic

Unregistered / Unconfirmed
GUEST, unregistred user!


{---------------------------------------
文件查找函数 MySearchFile

参数说明:
sFileName: 要查找的文件名称
sRootDir: 指定在哪个目录中查找
bFileOnly: 是否只查找文件
bRecurse: 是否查找子目录

返回值:
FileList: 查找结果列表
----------------------------------------}
function MySearchFile(sFileName, sRootDir: string;
bFileOnly, bRecurse: boolean): TStringList;
//内嵌文件查找递归过程
procedure DoSearchFile(sFileName, sRootDir: string;
bFileOnly, bRecurse: boolean;
var FileList: TStringList);
var
Found: integer;
SearchRec: TSearchRec;
begin
//开始查找
Found := FindFirst(sRootDir + '/*.*', faAnyFile, SearchRec);
while Found = 0 do
begin
//遇到子目录时确定是否查找子目录和是否将符合条件的子目录加入查找结果
if (SearchRec.Attr = faDirectory) and (SearchRec.Name <> '.') and
(SearchRec.Name <> '..') then
begin
if (AnsiCompareText(sFileName, SearchRec.Name) = 0) and not bFileOnly then
FileList.Add(sRootDir + '/' + SearchRec.Name);
if bRecurse then
DoSearchFile(sFileName, sRootDir + '/' + SearchRec.Name, bFileOnly, bRecurse, FileList);
end
//找到符合条件的文件时加入查找结果
else if AnsiCompareText(sFileName, SearchRec.Name) = 0 then
FileList.Add(sRootDir + '/' + SearchRec.Name);
Found := FindNext(SearchRec);
end;
FindClose(SearchRec);
end;
var
FileList: TStringList;
begin
FileList := TStringList.Create;
FileList.Clear;
DoSearchFile(sFileName, sRootDir, bFileOnly, bRecurse, FileList);
Result := FileList;
end;

调用:
s := MySearchFile('aaa.txt','D:',true,true);
知道为什么,当aaa.txt放到隐藏或只读属性的目录中就找不到!
我错在哪了?
 
是以下语句的问题

//遇到子目录时确定是否查找子目录和是否将符合条件的子目录加入查找结果
if (SearchRec.Attr = faDirectory) and (SearchRec.Name <> '.')
-------------------------
把上面改成

if ((SearchRec.Attr and faDirectory) = faDirectory) and (SearchRec.Name <> '.')

你原来的判断存在问题:如果 SearchRec.Attr 中有隐藏或系统属性,条件就不满足。
你的判断应该改成,“只要目录属性在 SearchRec.Attr 中”。
 
果然是啊,jsxjd,你真是我的救星!
好久没来大富翁了,看来以后要经常上来看看!
可以交你这个朋友吗?
我的MSN : Dephic@Sina.com
OICQ:40989768
 
倒~来晚了:)
 
接受答案了.
 
倒。。。还有问题啊,为什么在98的一些版本里查不到文件呢?
 
是不是文件夹或文件的属性为隐藏,可能是受文件夹属性的限制.
将文件夹选项设置为“显示所有文件”试试
 
顶部