以编程方式查找目录中的文件列表C ++ MFC

时间:2016-12-01 09:11:14

标签: c++ winapi mfc

我试图以编程方式查找目录中的文件列表,并且我已编写以下代码

CStringArray CCL2ProjectDirectoryPage::GetAllFilesNames()
{
  WIN32_FIND_DATA fileData;
  memset(&fileData, 0, sizeof(WIN32_FIND_DATA));
  HANDLE handle = FindFirstFile("d:\\test\\*", &fileData);

  CStringArray strArray;

  while(handle != INVALID_HANDLE_VALUE)
  {
    strArray.Add(fileData.cFileName); // the problem is that the fileData.cFileName always contains "."

    if(FALSE == FindNextFile(handle, &fileData))
    break;
  }
  FindClose(handle);

  return strArray;
}

问题是fileData.cFileName总是包含"。"。 ""第一个文件," .."用第二个文件等等。 这段代码有什么问题? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

你想要这个:

CStringArray GetAllFilesNames()
{
  WIN32_FIND_DATA fileData;
  memset(&fileData, 0, sizeof(WIN32_FIND_DATA));
  HANDLE handle = FindFirstFile("d:\\test\\*", &fileData);
  CStringArray strArray;

  if (handle != INVALID_HANDLE_VALUE)
  {
    do
    {
      if (_tcscmp(fileData.cFileName, _T(".")) != 0 && // ignore "." and ".."
        _tcscmp(fileData.cFileName, _T("..")) != 0)
      {
        strArray.Add(fileData.cFileName);
      }
    } while (FindNextFile(handle, &fileData));

    FindClose(handle);
  }

  return strArray;
}

免责声明:这是未经测试的最小错误检查代码,仅用于演示目的。

答案 1 :(得分:1)

您的代码仅使用Win32 API遍历目录/文件夹。 MFC这样做的方式要简单得多。框架附带CFileFind,更容易使用。此外,您无法返回CStringArray,因为它没有复制构造函数。您应该使用CStringArray引用作为方法的参数

void CCL2ProjectDirectoryPage::GetAllFilesNames(CStringArray& files)
{
    CFileFind finder;
    // start working for files
    BOOL bWorking = finder.FindFile(_T("d:\\test\\*"));
    while (bWorking)
    {
        bWorking = finder.FindNextFile();

        // skip . and .. files
        if (!finder.IsDots())
        {
            files.Add(finder.GetFileName());
        }
    }

}