2 qq 28254507 qq_28254507 于 2016.02.25 16:25 提问

MFC FindFirstFile()的问题

程序运行没问题。
但是我有个疑问。。见图:
图片说明
我是用了FindFirstFile()和FindNextFile()遍历所有文件夹,上图是我读取的路径,里面有两个文件夹,一个默认,一个新建,但是我发现读取时FindFirstFile()读取的先是新建的文件夹名称,然后才是默认的文件夹,难道不应该先读取默认文件夹吗?

求解惑啊。。

4个回答

Hungryof
Hungryof   2016.02.25 16:41
已采纳

https://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx 上面的Remark写了原因:
The FindFirstFile function opens a search handle and returns information about the first file that the file system finds with a name that matches the specified pattern. This may or may not be the first file or directory that appears in a directory-listing application (such as the dir command) when given the same file name string pattern. This is because FindFirstFile does no sorting of the search results.

FindFirstFile找到的文件和文件/文件夹显示的顺序不一定一样的,因为其对找到的结果不进行排序。

caozhy
caozhy   Ds   Rxr 2016.02.25 18:06
 // app1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "app1.h"
#include <vector>  
#include <algorithm>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

int cmp(const char * &a, const char * &b)
{
    return strcmp(a, b) < 0;
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        cerr << _T("Fatal Error: MFC initialization failed") << endl;
        nRetCode = 1;
    }
    else
    {
        // TODO: code your application's behavior here.
        //CString strHello;
        //strHello.LoadString(IDS_HELLO);
        //cout << (LPCTSTR)strHello << endl;
        _WIN32_FIND_DATAA fd;
        vector<char *> list;
        char * filename;
        HANDLE h = FindFirstFile("c:\\*.*", &fd);
        int r = 1;
        while (h != INVALID_HANDLE_VALUE && r != 0)
        {
            if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                if (strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, ".."))
                {
                    filename = new char[_MAX_PATH + 1];
                    strcpy(filename, fd.cFileName);
                    list.push_back(filename);
                }
            }
            r = FindNextFile(h, &fd);
        }
        sort(list.begin(), list.end(), cmp);
        for (vector<char *>::iterator it = list.begin(); it != list.end(); it++)  
        {  
            cout<< *it << endl; 
        } 
    }
    return nRetCode;
}


给你写了一个排序的

caozhy
caozhy   Ds   Rxr 2016.02.25 18:08

$Recycle.Bin
Documents and Settings
PerfLogs
Program Files
ProgramData
System Volume Information
Users
Windows
Press any key to continue

如果return strcmp(a, b) < 0;修改为
return strcmp(a, b) > 0;

Windows
Users
System Volume Information
ProgramData
Program Files
PerfLogs
Documents and Settings
$Recycle.Bin
Press any key to continue

另外请注意,这段演示的代码没有释放vector里每个char *,但是实际使用,需要释放下。

John_ToStr
John_ToStr   Rxr 2016.02.25 18:29

http://www.cnblogs.com/chenkunyun/archive/2012/03/24/2415727.html
并没有绝对的顺序:_**This may or may not be the first file or directory that appears in a directory-listing application (such as the dir command) when given the same file name string pattern. This is because FindFirstFile does no sorting of the search results.**_

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
FindFirstFile FindNextFile FindClose使用
TCHAR szFind[MAX_PATH] = _T("\\CF Card"); TCHAR cFileName[MAX_PATH] = { 0 }; WIN32_FIND_DATA stFindFileData; wcscat(szFind, _T("\\*.*")); //这里一定要指明通配符,不然不会读取所有文件和目录 HANDLE hFind = FindFirs
FindFirstFile用法
void CFindFilesDlg::OnBnClickedButton1() {  // TODO: 在此添加控件通知处理程序代码  CString c1;  CString stredit;  CString strtemp;  HANDLE hFile;  WIN32_FIND_DATA fileinfo;  DWORD errorcode = 0;  m_Edit1.G
FindFirstFile、FindNextFile和FindClose
在开发软件的过程里,经常需要维护目录里的数据。比如在开发银行的信用卡系统里,由于每天创建的LOG非常多,那么一个很大的硬盘,在6个月后,就占用了很多空间。这时就有这样的一个需求,把所有超过6个月的LOG数据定期删除掉。要实现这个功能就得遍历整个目录,把文件名称和文件创建的时间都超过6个月时间的文件删除掉。因此,就需使用到下面的API函数FindFirstFile和FindNextFile来实现这样
利用FindFirstFile和FindNextFile查找文件或遍历文件夹
FindFirstFile()根据文件名查找文件,函数执行成功返回一个搜索句柄,出错则返回INVALID_HANDLE_VALUE常数,查找结束应该用FindClose函数关闭搜索句柄。函数原型: HANDLE WINAPI FindFirstFile( _In_   LPCTSTR lpFileName, _Out_  LPWIN32_FIND_DATA lpFindFileDat
利用FindFirstFile(),FindNextFile()函数历遍指定目录的所有文件
本文利用FindFirstFile(),FindNextFile()函数历遍指定目录的所有文件,最基础的历遍所有文件。一下代码尚无法解决文件名为中文时的乱码问题,以及无法分别无后缀的文件名和文件夹名的区别。 FindFirstFile()用于获得指定目录的第一个文件。其原型为: lpFileName 用于指定搜索目录和文件类型,可以用通配符,初次使用需要注意 \ 需要用转义字符表达
C++使用通配符查找文件(FindFirstFile)
C++使用Windows通配符查找相应文件。
使用FindFirstFile和FindNextFile查找某个目录下的所有文件(包括子目录)
一、在不使用mfc的程序中获得某个目录下的所有文件名称,包括子目录。把文件名称以一个固定的程度放入一个缓冲中,这个缓冲要足够的大,能容下所有的文件名称。函数的输入为要查找的根目录,输出为存放所有文件名称的缓冲算法:使用递归二、代码:void FindFileInDir(char* rootDir, char* strRet){    char fname[MAC_FILENAM
FindFirstFile 函数要注意多字节字符问题
本来想搞搞FindFirstFile 函数的,写个代码把
使用WinAPI函数FindFirstFile或GetFileAttributes判断文件是否存在
函数FindFirstFile根据文件名查找文件:如执行成功,返回一个搜索句柄;如果出错,返回一个INVALID_HANDLE_VALUE常数。返回的如果是句柄,应该用FindClose函数关闭。 HANDLE WINAPI FindFirstFile( __in LPCTSTR lpFileName, __out LPWIN32_FIND_DATA lpFindFileDat
Windows API一日一练(58)FindFirstFile和FindNextFile函数
在开发软件的过程里,经常需要维护目录里的数据。比如在开发银行的信用卡系统里,由于每天创建的LOG非常多,那么一个很大的硬盘,在6个月后,就占用了很多空间。这时就有这样的一个需求,把所有超过6个月的LOG数据定期删除掉。要实现这个功能就得遍历整个目录,把文件名称和文件创建的时间都超过6个月时间的文件删除掉。因此,就需使用到下面的API函数FindFirstFile和FindNextFile来实现这样