怖客-致力于对网络技术的研究!

delphi编程实现指定盘符文件扫描

自行添加内容

主题: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,怖客会在第一时间回复.

自行添加内容
标签:delphidelphi培训delphi基础delphi实例教程
分类:编程教程| 发布:lxsky| 查看: | 发表时间:2011-12-29
原创文章如转载,请注明:转载自怖客,delphi教程,socket编程,vc 教程,电脑技术培训,网络安全 http://www.bkhack.com/
本文链接:http://www.bkhack.com/biancheng/delphiBianChengShiXianZhiDingPanFuWenJianSaoMiao.html

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

自行添加内容