《Delphi 版 everything、光速搜索代码》,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化。

就是有多个文件,它们可能属于同一个目录。

譬如 System32 目录下有2000多个文件,GetFullFileName 还是进行了2000多次的查询,效率肯定是受影响的。

先处理目录,获取目录全路径名称。

然后文件只用查询一次,就知道它的父路径的全路径了。效率肯定会提高的。尝试了一下。

{ 获取文件全路径,包含路径和文件名 }
procedure GetFullFileName(var FileList: TStringList; const chrLogiclDiskName: Char; const bSort: Boolean = False);
varUInt64DirList    : TArray<UInt64>;III              : Integer;UPID             : UInt64;intIndex         : Integer;dirList          : TStringList;intDirectoryCount: Integer;
begin{ 将 FileList 按 FileReferenceNumber 数值排序 }FileList.Sorted := False;FileList.CustomSort(Int64Sort);{ 先处理目录,获取路径的全路径名称 }dirList := TStringList.Create;try{ 获取目录的总数 }intDirectoryCount := 0;for III           := 0 to FileList.Count - 1 dobeginif PFileInfo(FileList.Objects[III])^.bDirectory thenbeginInc(intDirectoryCount);end;end;SetLength(UInt64DirList, intDirectoryCount);{ 将所有目录信息添加到目录列表 }intDirectoryCount := 0;for III           := 0 to FileList.Count - 1 dobeginif PFileInfo(FileList.Objects[III])^.bDirectory thenbegindirList.AddObject(PFileInfo(FileList.Objects[III])^.strFileName, FileList.Objects[III]);UInt64DirList[intDirectoryCount] := PFileInfo(FileList.Objects[III])^.FileReferenceNumber;Inc(intDirectoryCount);end;end;{ 获取目录的全路径名称 }intDirectoryCount := 0;for III           := 0 to FileList.Count - 1 dobeginif PFileInfo(FileList.Objects[III])^.bDirectory thenbeginUPID := PFileInfo(FileList.Objects[III])^.ParentFileReferenceNumber;while TArray.BinarySearch(UInt64DirList, UPID, intIndex) dobeginUPID                  := PFileInfo(dirList.Objects[intIndex])^.ParentFileReferenceNumber;FileList.Strings[III] := PFileInfo(dirList.Objects[intIndex])^.strFileName + '\' + FileList.Strings[III];end;FileList.Strings[III]              := (chrLogiclDiskName + ':\' + FileList.Strings[III]);dirList.Strings[intDirectoryCount] := FileList.Strings[III];Inc(intDirectoryCount);end;end;{ 再获取每个文件的全路径 }for III := 0 to FileList.Count - 1 dobeginif not PFileInfo(FileList.Objects[III])^.bDirectory thenbeginUPID := PFileInfo(FileList.Objects[III])^.ParentFileReferenceNumber;if TArray.BinarySearch(UInt64DirList, UPID, intIndex) thenbeginFileList.Strings[III] := dirList.Strings[intIndex] + '\' + FileList.Strings[III];endelsebeginFileList.Strings[III] := chrLogiclDiskName + '\' + FileList.Strings[III];end;end;end;{ 将所有文件按文件名排序 }if bSort thenFileList.Sort;finallydirList.Free;end;
end;

这个函数比原来的函数效率上刚好提高了一倍。

100万个的文件,耗时4秒左右。200万个的文件,耗时8秒左右。

注:原有的  TFileInfo 添加个目录属性:

TFileInfo = record
    strFileName: String;               // 文件名称
    bDirectory: Boolean;               // 是否是目录 <增加>
    FileReferenceNumber: UInt64;       // 文件的ID
    ParentFileReferenceNumber: UInt64; // 文件的父ID

end;

在代码

FileList.AddObject(strFileName, TObject(pfi));

前,添加一行:

pfi^.bDirectory  := UsnRecord^.FileAttributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY;

源码:https://github.com/dbyoung720/PBox/tree/master/module/uFiles

《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化相关推荐

  1. [转载]《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化...

    Delphi 版 everything.光速搜索代码>,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化. 就是有多个文件,它们可能属于同一个目录. 譬如 Sy ...

  2. java读取hdfs文件夹_HDFS 读取、写入、遍历文件夹获取文件全路径、append

    1.从HDFS中读取数据 Configuration conf = getConf(); Path path = new Path(pathstr); FileSystem fs = FileSyst ...

  3. HDFS 读取、写入、遍历文件夹获取文件全路径、append

    版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...

  4. C#路径中获取文件全路径、目录、扩展名、文件名称

    常用函数 需要引用System.IO   直接可以调用Path的静态方法 1 class Program2 {3 static void Main(string[] args)4 {5 6 //获取当 ...

  5. Delphi 版 everything、光速搜索代码

    近日没啥事情,研究了一下 everything.光速搜索原理.花了一个礼拜时间,终于搞定. 废话不多说,直接上代码: unit uMFTSearchFile; {dbyoung@sina.com201 ...

  6. [转载]Delphi 版 everything、光速搜索代码

    近日没啥事情,研究了一下 everything.光速搜索原理.花了一个礼拜时间,终于搞定. 废话不多说,直接上代码: [delphi] view plaincopy unit uMFTSearchFi ...

  7. 获取指定进程所对应的可执行(EXE)文件全路径(代码)

    1 #include "Psapi.h" 2 #pragma comment(lib, "Psapi.lib ")//需要包含头文件哦! 1 /* 功 能:获取 ...

  8. PHP获取当前url路径的函数及服务器变量:QUERY_STRING、REQUEST_URI、SCRIPT...

    1,$_SERVER["QUERY_STRING"] 说明:查询(query)的字符串 2,$_SERVER["REQUEST_URI"] 说明:访问此页面所需 ...

  9. PHP获取当前url路径的函数及服务器变量

    PHP获取当前url路径的函数及服务器变量: 代码如下: <?php echo $_SERVER['DOCUMENT_ROOT']."<br>"; //获得服务器 ...

最新文章

  1. 沈向洋:从深度学习到深度理解
  2. VXLAN和GRE的区别
  3. 给Anaconda安装国内镜像,加快下载速度
  4. 移植MT76x8 私有WIFI驱动V4.1.0.0到Openwrt 18.06所遇到的坑
  5. VTK:Shaders之CubeMap
  6. SharePoint 2013 开启訪问请求
  7. java.lang包【Object类】
  8. java xml解析_XML的理解以及SAX解析流程
  9. swarm 和 k8s_Wildfly Swarm,朝着成熟和一小部分贡献
  10. 《spring-boot学习》-01-初体验
  11. spring boot单元测试(转)
  12. 如何保证进程间同步工作_系统设计硬核知识(2)——操作系统的进程管理
  13. linux网络适配器驱动程序怎么安装,英特尔?服务器适配器 — Linuxixgbe* 基础驱动程序概述和安装...
  14. IntelliJ IDEA快速自动生成Junit测试类
  15. 60套模板免费送,一秒搞定甘特图
  16. Pr 添加字幕 预览不显示 是你没有打开字幕开关
  17. 网络打印机 显示服务器脱机,网络打印机老是脱机怎么回事_网络打印机显示脱机的处理办法...
  18. kettle工具实现数据的颗粒度转换以及珊瑚橘商务规划计算
  19. UOM Conversion Relationship Not Found
  20. 用MySQL数据库来处理中英文取首字母排序

热门文章

  1. 只待狂欢!青岛凤凰音乐节三大主题舞台搭建完毕
  2. 计算机英语wheel是什么意思,请帮忙翻译一下计算机英语~~急需~~~
  3. 服务器里怎么设置微信多开,私域必备,企业微信多开的4种方法
  4. 城市公交查询系统c语言,城市公交查询系统.doc
  5. android面试题-人事面试宝典二
  6. 西门子840d备份到u盘_西门子数控系统840D SL程序备份与报警设置.pptx
  7. 智慧社区网格化管理php,智慧社区网格化服务管理信息平台
  8. pytroch获取中间变量/feature
  9. 云南计算机专业本科学校,云南七成高校开设计算机专业 就业形势不容乐观
  10. selector.select()和selector.selectedKeys()