《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化
《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 函数的优化相关推荐
- [转载]《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化...
Delphi 版 everything.光速搜索代码>,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化. 就是有多个文件,它们可能属于同一个目录. 譬如 Sy ...
- java读取hdfs文件夹_HDFS 读取、写入、遍历文件夹获取文件全路径、append
1.从HDFS中读取数据 Configuration conf = getConf(); Path path = new Path(pathstr); FileSystem fs = FileSyst ...
- HDFS 读取、写入、遍历文件夹获取文件全路径、append
版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...
- C#路径中获取文件全路径、目录、扩展名、文件名称
常用函数 需要引用System.IO 直接可以调用Path的静态方法 1 class Program2 {3 static void Main(string[] args)4 {5 6 //获取当 ...
- Delphi 版 everything、光速搜索代码
近日没啥事情,研究了一下 everything.光速搜索原理.花了一个礼拜时间,终于搞定. 废话不多说,直接上代码: unit uMFTSearchFile; {dbyoung@sina.com201 ...
- [转载]Delphi 版 everything、光速搜索代码
近日没啥事情,研究了一下 everything.光速搜索原理.花了一个礼拜时间,终于搞定. 废话不多说,直接上代码: [delphi] view plaincopy unit uMFTSearchFi ...
- 获取指定进程所对应的可执行(EXE)文件全路径(代码)
1 #include "Psapi.h" 2 #pragma comment(lib, "Psapi.lib ")//需要包含头文件哦! 1 /* 功 能:获取 ...
- PHP获取当前url路径的函数及服务器变量:QUERY_STRING、REQUEST_URI、SCRIPT...
1,$_SERVER["QUERY_STRING"] 说明:查询(query)的字符串 2,$_SERVER["REQUEST_URI"] 说明:访问此页面所需 ...
- PHP获取当前url路径的函数及服务器变量
PHP获取当前url路径的函数及服务器变量: 代码如下: <?php echo $_SERVER['DOCUMENT_ROOT']."<br>"; //获得服务器 ...
最新文章
- 沈向洋:从深度学习到深度理解
- VXLAN和GRE的区别
- 给Anaconda安装国内镜像,加快下载速度
- 移植MT76x8 私有WIFI驱动V4.1.0.0到Openwrt 18.06所遇到的坑
- VTK:Shaders之CubeMap
- SharePoint 2013 开启訪问请求
- java.lang包【Object类】
- java xml解析_XML的理解以及SAX解析流程
- swarm 和 k8s_Wildfly Swarm,朝着成熟和一小部分贡献
- 《spring-boot学习》-01-初体验
- spring boot单元测试(转)
- 如何保证进程间同步工作_系统设计硬核知识(2)——操作系统的进程管理
- linux网络适配器驱动程序怎么安装,英特尔?服务器适配器 — Linuxixgbe* 基础驱动程序概述和安装...
- IntelliJ IDEA快速自动生成Junit测试类
- 60套模板免费送,一秒搞定甘特图
- Pr 添加字幕 预览不显示 是你没有打开字幕开关
- 网络打印机 显示服务器脱机,网络打印机老是脱机怎么回事_网络打印机显示脱机的处理办法...
- kettle工具实现数据的颗粒度转换以及珊瑚橘商务规划计算
- UOM Conversion Relationship Not Found
- 用MySQL数据库来处理中英文取首字母排序
热门文章
- 只待狂欢!青岛凤凰音乐节三大主题舞台搭建完毕
- 计算机英语wheel是什么意思,请帮忙翻译一下计算机英语~~急需~~~
- 服务器里怎么设置微信多开,私域必备,企业微信多开的4种方法
- 城市公交查询系统c语言,城市公交查询系统.doc
- android面试题-人事面试宝典二
- 西门子840d备份到u盘_西门子数控系统840D SL程序备份与报警设置.pptx
- 智慧社区网格化管理php,智慧社区网格化服务管理信息平台
- pytroch获取中间变量/feature
- 云南计算机专业本科学校,云南七成高校开设计算机专业 就业形势不容乐观
- selector.select()和selector.selectedKeys()