方法:如何解决CFindFile:FindNextFile找不到最后一个文件
2016-07-11 16:20
417 查看
转载请注明来源:http://www.cnblogs.com/xuesongshu/
在网上搜索到的一些遍历算法不仅繁锁,而且存在抄袭现象,而且抄袭的对象有问题,因为他们忽视了一个FindNextFile的一个很重要的问题。在这里我把对问题的分析以及我的方法分享给大家。
首先说明一下,Windows把所有数据单元称为文件,目录(即文件夹)也不例外。它有一个宏定义FILE_ATTRIBUTE_DIRECTORY标记注明该文件记录的是文件系统信息,而不是用户数据。目录与普通文件的一个重要区别是目录存储的是别的文件的信息。而普通文件记录的才是用户想要存储的数据。
实践证明,当FindNextFile找到最后一个文件时,它的返回值是FALSE。所以这个返回值我认为需要重新理解:它表示下次再执行该方法时找不到当前目录下的其它文件记录,不是表示本次没有找到。如果我们把文件系统对一个一个的文件的记录理解为单向链表,那么返回值FALSE表示下一个结点是NULL。
知道了问题,那么遍历算法可以这样写:
网上还搜到了一些方法,如何判断当前对象是不是目录(文件夹)。方法是调用shellapi。我认为大可不必如此麻烦,请看我的方法:
呵呵,又提到了FILE_ATTRIBUTE_DIRECTORY。我认为这才是微软的初忠。
在网上搜索到的一些遍历算法不仅繁锁,而且存在抄袭现象,而且抄袭的对象有问题,因为他们忽视了一个FindNextFile的一个很重要的问题。在这里我把对问题的分析以及我的方法分享给大家。
首先说明一下,Windows把所有数据单元称为文件,目录(即文件夹)也不例外。它有一个宏定义FILE_ATTRIBUTE_DIRECTORY标记注明该文件记录的是文件系统信息,而不是用户数据。目录与普通文件的一个重要区别是目录存储的是别的文件的信息。而普通文件记录的才是用户想要存储的数据。
实践证明,当FindNextFile找到最后一个文件时,它的返回值是FALSE。所以这个返回值我认为需要重新理解:它表示下次再执行该方法时找不到当前目录下的其它文件记录,不是表示本次没有找到。如果我们把文件系统对一个一个的文件的记录理解为单向链表,那么返回值FALSE表示下一个结点是NULL。
知道了问题,那么遍历算法可以这样写:
CFileFind ff; BOOL bFind=ff.FindFile("c:\\*.*"); CString szFileName=L""; do { bFind=ff.FindNextFile(); if (ff.IsDots()) { continue; } szFileName=ff.GetFileName(); if (szFileName.IsEmpty()) { break; } if (!ff.IsDirectory()) { InsertItem(0,szFileName.GetBuffer(szFileName.GetLength())); } } while (bFind);
网上还搜到了一些方法,如何判断当前对象是不是目录(文件夹)。方法是调用shellapi。我认为大可不必如此麻烦,请看我的方法:
BOOL isDirectory=::GetFileAttributes(szFullPath)&FILE_ATTRIBUTE_DIRECTORY;
呵呵,又提到了FILE_ATTRIBUTE_DIRECTORY。我认为这才是微软的初忠。
相关文章推荐
- 2016.07.11 完成 9 道题
- Android技术进阶的要素——Android属性动画
- Strider 持续集成(gitlab)
- 移动端开发网络优化建议
- 解决:sudo: 无法解析主机:dinphy-500-310cn: 连接超时
- 用纯C语言写的一个植物大战僵尸的外挂
- 我对.Net应用价值的一些思考
- 随笔:我为什么要写博客?
- 易语言 修改IE协议头模拟手机浏览网页
- 素数筛法
- Linux三大共享文件的方法
- 【Android】无法发送短信的问题
- session与cookie的区别
- 扒一扒网页设计里的浮动 属性
- Java出现No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing
- [转载]Java面试基础概念总结
- 【2014.8.17NOIP普及组模拟】公牛数学
- 【HTML5开发系列】CSS3
- nginx命令
- Hdu1251-统计难题(字典树)