捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
演示两种方法来遍历文件
关键字:文件遍历 EnumFileInQueue 队列遍历 EnumFileInRecursion 递归遍历
来 自:原创
平 台:Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:中级 完成时间:2006/8/20
发布者:cenjoy 发布时间:2006/8/22
编辑器:DELPHI7 语  种:简体中文
分 类:系统 下载浏览:2668/14597
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
演示两种方法来遍历文件

两个函数:
EnumFileInQueue     队列遍历
EnumFileInRecursion 递归遍历

版本:v1.0
时间:2006.8.20

作者:cenjoy 温校宏
邮箱:cenjoyer@163.com

说明:
看见很多遍历文件的文章都是用递归实现,可是当子目录非常非常多时,就很容易堆栈溢出.
而使用队列的方法就不会出现这种问题.因为发现网上这种方法比较少见,所以把它贡献出来.

使用队列这种方法不是我想出来的,我从书上看到的.原书用的是TStringList来实现队列,我直接使用TQueue.我是第一次使用这个东西.另外用到了StrNew函数,隐约好像有些问题,不过一时间没有察觉.

已知未解决问题:
1.如何统计遍历的时间和搜索结果
(如何知道用CreateThread创建的线程何时结束)

2.你来说吧~~~~

如果你能解决这些问题,希望你能发一份给我~a~
非常欢迎来跟我讨论相关Delphi的问题!!!!
发我Email:cenjoyer@163.com,也可以加我QQ:48932987.
不过这段时间很上Q.9月份开学后就能常上了.
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论10条 当前显示最后6条评论
cenjoy 2006/9/5 17:39:22
我的意思就是目录深度过长的问题.
"子目录",目录的子目录,子目录的子目录....
cenjoy 2006/9/5 17:40:23
很感谢speedbin还给我发了邮件纠正了内存泄露的问题.
monkey_cn 2006/9/13 20:07:57
更实用点的封装:
{用队列的方法遍历文件
  path:=DriveComboBox1.Drive + ':';
  count:=EnumFileInQueue(StrNew(PChar(path)),Memo1.Lines);
}
function EnumFileInQueue(path: PChar;vFileList:TStrings): Longint; stdcall;
var
  searchRec: TSearchRec;
  found: Integer;
  tmpStr: string;
  curDir: string;
  dirs: TQueue;
  pszDir: PChar;
begin
  vFileList.Clear;
  Result := 0; //查找结果(文件数)
  dirs := TQueue.Create; //创建目录队列
  dirs.Push(path); //将起始搜索路径入队
  pszDir := dirs.Pop;
  curDir := StrPas(pszDir); //出队
  StrDispose(pszDir);

  while (True) do//开始遍历,直至队列为空
  begin
    tmpStr := curDir + '\*.*';//加上搜索后缀,得到类似'c:\*.*' 、'c:\windows\*.*'的搜索路径

    found := FindFirst(tmpStr, faAnyFile, searchRec);//在当前目录查找第一个文件、子目录
    while found = 0 do
    begin
      if (searchRec.Attr and faDirectory) <> 0 then//如果找到的是个目录
      begin
        if (searchRec.Name <> '.') and (searchRec.Name <> '..') then
        begin
          tmpStr := curDir + '\' + searchRec.Name;
          dirs.Push(StrNew(PChar(tmpStr)));
        end;
      end else
      begin
        Result := Result + 1;
        vFileList.Add(curDir + '\' + searchRec.Name);
      end;
      found := FindNext(searchRec);//查找下一个文件或目录
    end;
    if dirs.Count > 0 then
    begin
      pszDir := dirs.Pop;
      curDir := StrPas(pszDir);
      StrDispose(pszDir);
    end
    else
      break;
  end;

  //释放资源
  dirs.Free;
  FindClose(searchRec);
end;

{用递归的方法遍历文件}
function EnumFileInRecursion(path: PChar;vFileList:TStrings): Longint; stdcall;
var
  searchRec: TSearchRec;
  found: Integer;
  tmpStr: string;
begin
  vFileList.Clear;
  Result := 0; //查找结果(文件数)

  tmpStr := StrPas(path) + '\*.*';

  found := FindFirst(tmpStr, faAnyFile, searchRec);//第一个文件或目录
  while found = 0 do
  begin
    if (searchRec.Attr and faDirectory) <> 0 then
    begin
      if (searchRec.Name <> '.') and (searchRec.Name <> '..') then
      begin
        tmpStr := StrPas(path) + '\' + searchRec.Name;
        Result := Result + EnumFileInRecursion(PChar(tmpStr),vFileList);//递归调用
      end;
    end
    else begin
      Result := Result + 1;
      //把找到的文件加到Memo控件
      vFileList.Add(StrPas(path) + '\' + searchRec.Name);
    end;
    //查找下一个文件或目录
    found := FindNext(searchRec);
  end;
  //释放资源
  FindClose(searchRec);
end;
aizaixiiii 2006/9/29 10:28:32
hao!
cenjoy 2006/10/4 18:18:00
你这种方法好是好,但是我最担心的是内存够不够用的问题!!!
jackalan 2006/10/23 12:48:04
多线程内慎用,资源消耗比较大。
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表