zoukankan      html  css  js  c++  java
  • 方法:如何解决CFindFile:FindNextFile找不到最后一个文件

    转载请注明来源:http://www.cnblogs.com/xuesongshu/

      在网上搜索到的一些遍历算法不仅繁锁,而且存在抄袭现象,而且抄袭的对象有问题,因为他们忽视了一个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。我认为这才是微软的初忠。

  • 相关阅读:
    P4718 [模板]Pollard-Rho算法
    python爬虫模板
    Codeforces1248F. Catowice City
    P3980 [NOI2008]志愿者招募 (费用流)
    P2805 [NOI2009]植物大战僵尸 (拓扑排序 + 最小割)
    P3157 [CQOI2011]动态逆序对
    P2634 [国家集训队]聪聪可可 (点分治)
    HDU6703 array (线段树)
    Codeforces750E. New Year and Old Subsequence (线段树维护DP)
    Codeforces301D. Yaroslav and Divisors
  • 原文地址:https://www.cnblogs.com/xuesongshu/p/2909907.html
Copyright © 2011-2022 走看看