DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cppchuxue
今日帖子: 0
在线用户: 4
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 draculamx (draculamx) ▲▲△△△ -
注册会员
2018/7/6 20:17:34
标题:
遍历文件,文件夹排序的问题 浏览:272
加入我的收藏
楼主: 现在要去遍历一个文件夹以及子文件夹还有子文件夹下的文件,用的是FindFirst,FindNext,方法就不多说了,这不是问题

我现在的问题是,当用这些函数去遍历的时候,遍历出来的结果是如何排序的,也就是说,既然是遍历,就是一个一个找出来,那么肯定是有个先后顺序的,调用这两个函数遍历的时候,默认是什么排序呢?文件名?创建时间?

有没有办法能指定排序规则??然后再来查找,这样可以提高查找效率(假设查找的文件以时间排序)
----------------------------------------------
C++ builder 用户前来摸鱼。。。
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/7/6 20:26:31
1楼: 排序规则按文件名,比对结果和strcmp的结果相同(注意区分大小写)。
如果要自定义排序,可以用链表方式存储文件链,用插入排序来排列你的结果。
----------------------------------------------
--
作者:
男 dbyoung (dbyoung) ▲▲▲▲▲ -
普通会员
2018/7/6 21:01:53
2楼: type
  PFileInfo = ^TFileInfo;
  TFileInfo = record
     strFileName:String;
     dtFileDate: TDateTime;
     ..........
  end;

将搜索结果 TFileInfo,AddObject 到 TStringList 中。


然后,对 TStringList 排序。
当然 TStringList 提供了让你自定义排序的功能。
TStringList.CustomSort(FileDateSort);

function FileDateSort(List: TStringList; Index1, Index2: Integer): Integer;
var
  dtA, dtB:TDateTime;
begin
  dtA := PFileInfo(List.Objects[Index1])^.dtFileDate;
  dtB := PFileInfo(List.Objects[Index2])^.dtFileDate;
  if dtA < dtB then
    Result := -1
  else if dtA = dtB then
    Result := 0
  else
    Result := 1;
end;
----------------------------------------------
Delphi7爱好者
作者:
男 draculamx (draculamx) ▲▲△△△ -
注册会员
2018/7/6 21:25:21
3楼: 谢回答和代码,其实我不是要对遍历的结果进行排序,我是有个想法,想提高遍历的速度。

我有一个文件夹,里面的文件名都是用时间和日期命名的,这些文件夹建立的时间顺序也是和他们的文件名相同,比如 2018-08-09,2018-08-10,这是两个文件夹,并且建立的顺序也是和这两个文件名所代表的时间一致。

我现在有一个时间点,比如 2018-08-09,我现在遍历的目的,就是找到大于这个时间点的文件夹。

所以我才会想到:如果我遍历的时候,按照文件建立的时间,从后往前遍历,这样当我遍历到小于2018-08-09这个时间点的时候,我就不用再继续遍历了,可以提高遍历效率。而不用把每个文件夹都遍历一遍了

不知道我这个想法,有没有可行性
----------------------------------------------
C++ builder 用户前来摸鱼。。。
作者:
男 draculamx (draculamx) ▲▲△△△ -
注册会员
2018/7/6 21:33:13
4楼: The order in which this function returns the file names is dependent on the file system type. With NTFS and CDFS file systems, the names are returned in alphabetical order. With FAT file systems, the names are returned in the order the files were written to the disk, which may or may not be in alphabetical order.

如果英文稍微知道点的话,就可以看明白了。这个顺序是没有办法修改的。
和文件系统有关,NTFS和CDFS下,是按照字母顺序,而FAT下,按照文件创建时间顺序

这是我找到的,看来是没有办法了。。

调用FindFirstFile的时候,排序是由系统决定的。。。

有没有其他途径来按照自己想要的排序来遍历文件夹呢????
----------------------------------------------
C++ builder 用户前来摸鱼。。。
作者:
男 keymark (keymark) ▲△△△△ -
注册会员
2018/7/6 22:03:26
5楼: https://blog.csdn.net/dbyoung/article/details/80077154  快速搜索。
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ▲▲▲▲▲ -
普通会员
2018/7/6 22:53:07
6楼: 没弄懂你的意图。
按照我的理解,你不需要枚举文件。只要搜索文件夹,并排序,就可以了。
找到文件夹不就可以了吗?

var
  dirArr: TStringDynArray;
  strdir: String;
  strList: TStringList;
begin
  dirArr := TDirectory.GetDirectories('D:\Image');
  strList := TStringList.Create;
  strList.Sorted := True;
  for strdir in dirArr do
    strList.Add(strdir);
----------------------------------------------
Delphi7爱好者
作者:
男 draculamx (draculamx) ▲▲△△△ -
注册会员
2018/7/7 1:24:35
7楼: 找到满足条件的文件夹,是我的目的,没错

假如现在有200个文件夹,按照普通做法,我需要遍历这200个文件夹,然后根据某个条件判断,在其中筛选出100个。

如果我按照文件夹创建时间的先后顺序去遍历,我就可以不遍历200个,有可能只需要遍历几个,就能筛选出满足我条件的文件夹了

简单点,现在有个数组包含 1,2,3,4,5,6,7 ,已经从小到大排序了,我要找出比3大的,是不是只需要从后向前查找,遍历4个就够了,如果从前向后逐个查找,那么1,2,你也要遍历一遍,这样就多遍历了2个

我要的目的,就是找到满足条件的文件夹,并且减少遍历的次数。。。
----------------------------------------------
C++ builder 用户前来摸鱼。。。
作者:
男 dbyoung (dbyoung) ▲▲▲▲▲ -
普通会员
2018/7/7 2:55:30
8楼: var
  dirArr: TStringDynArray;
  strdir: String;
  strList: TStringList;
begin
  dirArr := TDirectory.GetDirectories('D:\Image');
  strList := TStringList.Create;
  strList.Sorted := True;
  for strdir in dirArr do
    strList.Add(strdir);


这个代码,搜索个上千个目录,也用不了一秒吧。
----------------------------------------------
Delphi7爱好者
作者:
男 moom (小新啊) ▲△△△△ -
注册会员
2018/7/7 12:18:21
9楼: 可能楼主的意思是文件夹有几十万个,

那楼上的 1秒,就变了几十秒了,

那样就是楼主要求的优化了...
----------------------------------------------
谢谢各位大大
作者:
男 dbyoung (dbyoung) ▲▲▲▲▲ -
普通会员
2018/7/7 13:13:25
10楼: 楼主是按日期建立目录的,一天1个,一年365个。十年才3650个。10万需要多少年?
----------------------------------------------
Delphi7爱好者
作者:
男 draculamx (draculamx) ▲▲△△△ -
注册会员
2018/7/7 13:25:04
10楼:
var dirArr: TStringDynArray; strdir: String; strList: TStringList; begin dirArr := TDirectory.GetDirectories('D:\Image'); strList := TStringList.Create; strList.Sorted := True; for strdir in dirArr do strList.Add(strdir); 这个代码,搜索个上千个目录,也用不了一秒吧。



这段代码很有用,很受启发,感谢

我这个目录下,是根据天数新建的文件夹,每天新建一个,所以我担心时间长了,会很耗时间,后来一算,就算1000个文件夹,也差不多三年了,过了质保了,不管了。。

把这个过程丢到线程中去,让它自由飞翔吧。。。
----------------------------------------------
C++ builder 用户前来摸鱼。。。
作者:
男 draculamx (draculamx) ▲▲△△△ -
注册会员
2018/7/7 15:24:38
11楼: 经常写代码的时候,把事情想得太长远,太复杂,总想优化,边写边优化,真是个很坏的毛病,浪费很多时间。。。

是不是应该先完成功能,再回头来优化?
----------------------------------------------
C++ builder 用户前来摸鱼。。。
作者:
男 dbyoung (dbyoung) ▲▲▲▲▲ -
普通会员
2018/7/8 8:17:51
12楼: 以最简单的方式,来完成业务逻辑。
软件以稳定为第一位的。不是以速度。
软件正确、稳定,慢一点,公司、客户都是能忍受的。

如果能稳定工作,连优化都不需要。碰都不用碰。
如果你有强迫症(我也是此类人,大多数的程序员都有一点点吧),一定想改,你也最好先了解好业务需求。
再看看代码,别人为什么这样写。是技术问题,还是业务逻辑造成的这样。
了解清楚了,在修改不迟。重写也可以(重写也仅限于一两个函数而已)。

在第一次写代码时,不用想着优化。
写完代码以后,回头看时,发现需要优化时,也只是需要优化一两个函数而已。
集中力量、技术,优化它就可以了。其它都保持不变。

复杂问题简单化,应该是每一个程序员该干的事。而不是将简单问题复杂化。
----------------------------------------------
Delphi7爱好者
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2018/7/8 14:51:00
13楼: 你如果是按日期来建立的,那简单啊,从你指定的日期开始,用DirectoryExists做测试,然后日期加1,继续……直到你想要结束的日期。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 偶的生活博客  偶的技术军事博客
作者:
男 draculamx (draculamx) ▲▲△△△ -
注册会员
2018/7/8 19:49:42
14楼: DirectoryExists的内部实现,应该也是挨个遍历,效率估计比遍历一次还要低一点。。

强迫症我觉得每个写代码的都会有,只不过轻重程度不同吧,我估计比较重一点

写代码之前,想了一个流程,然后写到一半,发现这个流程不好,然后从头重写。。。

这样做就是很耗时间,但是好处也不是没有,就是代码质量和程序结构还行,下次碰到客户要修改程序功能的时候,很容易修改,不用牵一发而动全身
----------------------------------------------
C++ builder 用户前来摸鱼。。。
作者:
男 draculamx (draculamx) ▲▲△△△ -
注册会员
2018/7/8 19:55:18
15楼: 不过我这种方法,是因为我个人能力不足,在写代码之前,规划的不行,或者说架构不行,所以在写到一半的时候,才会发现有更好的架构。这我也没办法,只有慢慢去积累。。

软件的速度问题也是相对的,我一般做的是工业程序,很多时候,达不到某个速度,软件功能就是失败的,比如,要求你传输数据的更新频率是50HZ,你就必须达到这个数值,否则验收就通不过,所以我有时候在写非工业程序的时候,也把速度要求给带进去了。。。
----------------------------------------------
C++ builder 用户前来摸鱼。。。
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行21.48438毫秒 RSS