6122|19

89

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何快速读取目录清单 [复制链接]

在VC++下,有没有类似Linux/Unix下的Opendir Readdir之类的API,能快速读取某个目录下的文件或子目录列表的?
不喜欢用FindNextFile之类,这样遍历太慢,因为需要读取一个多文件目录.

最新回复

方法1:应用 目录项缓存与散列表。 方法2:应用IShellFolder接口。   详情 回复 发表于 2008-5-23 16:30
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
还是要递归吧?

貌似效率不会太低啊
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主对效率的要求令我等自卑。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
我是在EVC下用的,操作系统是WinCE,比PC机慢了很多,几百个文件就要好几秒
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
并且我要读取文件名后寻找满足条件的,要是能一下子读处文件清单,然后在内存里排序,就能够快速找到需要的文件
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 
FindNextFile这个也可以快呀
一般递归也可以,想再快点就有多线程!
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
难道没有成熟的API可供调用么,实际上目录下的文件列表,操作系统应该也是保存成一个文件或者一个数据块来管理的吧,怎么没有直接读取出来的API呢,比如Linux的ReadDir
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
我要处理的目录,结构其实十分简单,只有单一类型的文件,但是可能有很多,且文件名有特殊含义,可以根据文件名来判断是否满足条件. 所以应该是不需要用递归的,我只是想快速读取该目录下的所有文件名,然后在内存中处理,不想一个一个慢慢吞吞的读,这样显然更慢.因为是在WinCE上,所以这2种方式的差别是明显的
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等
            CompareFileTime 对比两个文件的时间
            CopyFile 复制文件
            CreateDirectory 创建一个新目录
            CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台
            CreateFileMapping 创建一个新的文件映射对象
            DeleteFile 删除指定文件
            DeviceIoControl 对设备执行指定的操作
            DosDateTimeToFileTime 将DOS日期和时间值转换成一个 win32 FILETIME 值
            FileTimeToDosDateTime 将一个 win32 FILETIME 值转换成DOS日期和时间值
            FileTimeToLocalFileTime 将一个FILETIME结构转换成本地时间
            FileTimeToSystemTime 根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构
            FindClose 关闭由FindFirstFile函数创建的一个搜索句柄
            FindFirstFile 根据文件名查找文件
            FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件
            FlushFileBuffers 针对指定的文件句柄,刷新内部文件缓冲区
            FlushViewOfFile 将写入文件映射缓冲区的所有数据都刷新到磁盘
            GetBinaryType 判断文件是否可以执行
            GetCompressedFileSize 判断一个压缩文件在磁盘上实际占据的字节数
            GetCurrentDirectory 在一个缓冲区中装载当前目录
            GetDiskFreeSpace 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量
            GetDiskFreeSpaceEx 获取与一个磁盘的组织以及剩余空间容量有关的信息
            GetDriveType 判断一个磁盘驱动器的类型
            GetExpandedName 取得一个压缩文件的全名
            GetFileAttributes 判断指定文件的属性
            GetFileInformationByHandle 这个函数提供了获取文件信息的一种机制
            GetFileSize 判断文件长度
            GetFileTime 取得指定文件的时间信息
            GetFileType 在给出文件句柄的前提下,判断文件类型
            GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息
            GetFileVersionInfoSize 针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区
            GetFullPathName 获取指定文件的完整路径名
            GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母
            GetLogicalDriveStrings 获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径
            GetOverlappedResult 判断一个重叠操作当前的状态
            GetPrivateProfileInt 为初始化文件(.ini文件)中指定的条目获取一个整数值
            GetPrivateProfileSection 获取指定小节(在.ini文件中)所有项名和值的一个列表
            GetPrivateProfileString 为初始化文件中指定的条目取得字串
            GetProfileInt 取得win.ini初始化文件中指定条目的一个整数值
            GetProfileSection 获取指定小节(在win.ini文件中)所有项名和值的一个列表
            GetProfileString 为win.ini初始化文件中指定的条目取得字串
            GetShortPathName 获取指定文件的短路径名
            GetSystemDirectory 取得Windows系统目录(即System目录)的完整路径名
            GetTempFileName 这个函数包含了一个临时文件的名字,它可由应用程序使用
            GetTempPath 获取为临时文件指定的路径
            GetVolumeInformation 获取与一个磁盘卷有关的信息
            GetWindowsDirectory 获取Windows目录的完整路径名
            hread 参考lread
            hwrite 参考lwrite函数
            lclose 关闭指定的文件
            lcreat 创建一个文件
            llseek 设置文件中进行读写的当前位置
            LockFile 锁定文件的某一部分,使其不与其他应用程序共享
            LockFileEx 与LockFile相似,只是它提供了更多的功能
            lopen 以二进制模式打开指定的文件
            lread 将文件中的数据读入内存缓冲区
            lwrite 将数据从内存缓冲区写入一个文件
            LZClose 关闭由LZOpenFile 或 LZInit函数打开的一个文件
            LZCopy 复制一个文件
            LZInit 这个函数用于初始化内部缓冲区
            LZOpenFile 该函数能执行大量不同的文件处理,而且兼容于压缩文件
            LZRead 将数据从文件读入内存缓冲区
            LZSeek 设置一个文件中进行读写的当前位置
            MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间
            MoveFile 移动文件
            OpenFile 这个函数能执行大量不同的文件操作
            OpenFileMapping 打开一个现成的文件映射对象
            QueryDosDevice 在Windows NT中,DOS设备名会映射成NT系统设备名。该函数可判断当前的设备映射情况
            ReadFile 从文件中读出数据
            ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
            RegCloseKey 关闭系统注册表中的一个项(或键)
            RegConnectRegistry 访问远程系统的部分注册表
            RegCreateKey 在指定的项下创建或打开一个项
            RegCreateKeyEx 在指定项下创建新项的更复杂的方式。在Win32环境中建议使用这个函数
            RegDeleteKey 删除现有项下方一个指定的子项
            RegDeleteValue 删除指定项下方的一个值
            RegEnumKey 枚举指定项的子项。在Win32环境中应使用RegEnumKeyEx
            RegEnumKeyEx 枚举指定项下方的子项
            RegEnumValue 枚举指定项的值
            RegFlushKey 将对项和它的子项作出的改动实际写入磁盘
            RegGetKeySecurity 获取与一个注册表项有关的安全信息
            RegLoadKey 从以前用RegSaveKey函数创建的一个文件里装载注册表信息
            RegNotifyChangeKeyValue 注册表项或它的任何一个子项发生变化时,用这个函数提供一种通知机制
            RegOpenKey 打开一个现有的注册表项
            RegOpenKeyEx 打开一个现有的项。在win32下推荐使用这个函数
            RegQueryInfoKey 获取与一个项有关的信息
            RegQueryValue 取得指定项或子项的默认(未命名)值
            RegQueryValueEx 获取一个项的设置值
            RegReplaceKey 用一个磁盘文件保存的信息替换注册表信息;并创建一个备份,在其中包含当前注册表信息
            RegRestoreKey 从一个磁盘文件恢复注册表信息
            RegSaveKey 将一个项以及它的所有子项都保存到一个磁盘文件
            RegSetKeySecurity 设置指定项的安全特性
            RegSetValue 设置指定项或子项的默认值
            RegSetValueEx 设置指定项的值
            RegUnLoadKey 卸载指定的项以及它的所有子项
            RemoveDirectory 删除指定目录
            SearchPath 查找指定文件
            SetCurrentDirectory 设置当前目录
            SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾
            SetFileAttributes 设置文件属性
            SetFilePointer 在一个文件中设置当前的读写位置
            SetFileTime 设置文件的创建、访问及上次修改时间
            SetHandleCount 这个函数不必在win32下使用;即使使用,也不会有任何效果
            SetVolumeLabel 设置一个磁盘的卷标(Label)
            SystemTimeToFileTime 根据一个FILETIME结构的内容,载入一个SYSTEMTIME结构
            UnlockFile 解除对一个文件的锁定
            UnlockFileEx 解除对一个文件的锁定
            UnmapViewOfFile 在当前应用程序的内存地址空间解除对一个文件映射对象的映射
            VerFindFile 用这个函数决定一个文件应安装到哪里
            VerInstallFile 用这个函数安装一个文件
            VerLanguageName 这个函数能根据16位语言代码获取一种语言的名称
            VerQueryValue 这个函数用于从版本资源中获取信息
            WriteFile 将数据写入一个文件
            WriteFileEx 与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调
            WritePrivateProfileSection 为一个初始化文件(.ini)中指定的小节设置所有项名和值
            WritePrivateProfileString 在初始化文件指定小节内设置一个字串
            WriteProfileSection 为Win.ini初始化文件中一个指定的小节设置所有项名和值
            WriteProfileString 在Win.ini初始化文件指定小节内设置一个字串
===================================================================================
找找有没有能用的
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
首选FindFirstFile/FindNextFile/FindClose

如果发现效率低,原因不在于WINAPI,很可能是因为程序中可能使用了递归.(使用递归,效率必然低)

 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
如果你真的认为效率是个问题,就请用profile工具精确定位瓶颈。对于效率,程序员的猜测基本总是错误的。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

12
 
全部读进内存再排序为甚么快?
为甚么不读文件名就将它加入到一个堆里面,等读完,不是就全部都排好序了么?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
我用FindFirstFile(*.*),FindNextFile遍历该目录下的所有文件,仅仅遍历别的什么也不作,就花了好几秒(我的目录下可能有几千个文件,是摄像头拍摄的照片.)
所以是经过测试发现速度比较慢,如果遍历时再根据文件名进行判断是否满足条件(文件名有特殊含义,包括了一些信息),则可以预计将更慢.
为此,我才希望能快速读取文件名到内存进行判断.

在CE下,读取文件,一个大数据块一次性读入,和分成若干个小部分读取,速度是有差别的,比如,底层的驱动访问Flash,驱动按块(512字节)管理,读一个字节恐怕都要整块读取,所以如果你一次性读512字节,和读一个字节,速度一样,如果你512字节分成512次读,速度就慢了很多. 所以我总是希望能成块读取文件,放在内存里进行分析、排序。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

14
 
mark
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

15
 
mark2      
哈哈
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

16
 
mark
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

17
 
mark,
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

18
 
就这个速度,没有快的办法,但是通过读取分区表的方式最快,可惜你访问不到。程序慢不要紧,只要让用户感觉能接受就行,比如采取边读边显示的方法。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

19
 
楼上说的什么屁话,什么叫:程序慢不要紧。。。,慢的程序你用啊。不懂就别说话。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

20
 
方法1:应用 目录项缓存与散列表。
方法2:应用IShellFolder接口。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表