主题:delphi编程实现指定盘符文件扫描
分类:delphi基础教程
BY:lxsky QQ:86717375
首发:怖客官方网站【www.bkhack.com】
上一节,我们学习了用api函数:getdrivetype来获取电脑的磁盘列表,并把结果显示在combobox控件的下拉列表中,这节,我们就在上一节的基础上增加一个功能,实现指定盘符的全部文件扫描!就像杀毒软件那样,扫描所有文件。不同的是我们的程序不带文件安全分析功能,
另外,透露一下,呵呵,在我们的delphi高级编程课程里就会有一课,在这一节的基础上实现文件特征码分析扫描!打造我们自己的杀毒软件,能否检测出病毒就在于我们的程序设置的病毒特征码是否够全,够新了...
前面说的这些,都是为了更加大家对编程的学习兴趣,让我们在编程时有激情!
好了,我们还是步入今天的正题吧.
程序界面布局:
一个MEMO控件(memo1),一个button按钮控件(button1),一个标签控件(label1),一个COMBOBOX下拉列表框控件(combobox1).
属性:设置memo1有纵向滚动条;
设置button空间的caption属性为:开始搜索;
设置标签控件的caption属性为:搜索路径;
清空combobox中初始显示字符,去掉memo1的默认显示字符.
分析:
程序结构很简单,首先编写一个自定义函数”EnumFile“,用于枚举文件,也是主要难点,过程中使用了findfirst和findnext,并且还需要判断是文件还是目录,若是文件则直接增加到memo1中,如果是目录,则调用函数自身,查找子目录,这有利于理解“递归”概念.其中的注解已经很详细了,嵌套有点多,大家需要仔细分析,逻辑...逻辑....
================================================================
函数代码:
function EnumFile(path:PChar):Longint;stdcall;
var
searchRec:TSearchRec;
found:Integer;
tmpStr:String;
begin
Result:=0; //查找结果(文件数)
tmpStr:=StrPas(path)+'\*.*';//这里的path由按钮控件把cmobobox中的数据传入.
found:=FindFirst(tmpStr,faAnyFile,searchRec);//在当前目录查找第一个文件、子目录
while found=0 do
//找到了一个文件或目录后
begin
//如果找到的是个目录
if (searchRec.Attr and faDirectory)<>0 then // 是一个目录
begin
{在搜索非根目录(C:\、D:\)下的子目录时会出现'.','..'的"虚拟目录"
要过滤掉才可以}
if (searchRec.Name <> '.') and (searchRec.Name <> '..') then
begin
{由于查找到的子目录只有个目录名,所以要添上上层目录的路径
searchRec.Name = 'Windows';tmpStr:='c:\Windows';
加个断点就一清二楚了}
tmpStr:=StrPas(path)+'\'+searchRec.Name;
//自身调用,查找子目录,函数的递归调用
Result:=Result+EnumFileInRecursion(PChar(tmpStr));
end;
end
//如果找到的是个文件
{这个也是递归的结束条件,结束条件对于理解递归来说,相当重要}
else //是一个文件
begin
{Result记录着搜索到的文件数。可是我是用CreateThread创建线程
来调用函数的,不知道怎么得到这个返回值。。。我不想用全局变量}
Result:=Result+1;
//把找到的文件加到Memo控件
Form1.Memo1.Lines.Add(StrPas(path)+'\'+searchRec.Name);
end;
//查找下一个文件或目录
found:=FindNext(searchRec);
end;
//释放资源
FindClose(searchRec);
end;
================================================================
然后用一个按钮的单击事件调用该函数,并传入combobox中的值.
=================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
EnumFile(pchar(combobox1.Text));
end;
=================================================================
上一节的自动获取磁盘列表源代码也再来复习一下.
=================================================================
procedure TForm1.Formcreate(Sender: TObject);
var
i:integer;
n:integer;
begin
for i:=65 to (65+25) do
begin
n:=getdrivetype(pchar(chr(i)+':\'));
if n<>0 then
if n<>1 then
combobox1.ITEMS.add(chr(i)+':');
end;
end;
===================================================================
好了。程序就这样完成了.运行后,选择下拉列表中需要搜索的磁盘,点击开始搜索,memo1中就会动态的不断的列出该磁盘下的所有文件了.这节课就到这里了.
课后有问题?请到www.bkhack.com/guestbook.asp留言并留下EMAIL,怖客会在第一时间回复.
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。